微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

简单的多线程程序问题

如何解决简单的多线程程序问题

我刚刚开始阅读有关多线程的文章,并尝试用 C++ 编写一个非常简单的程序。

问题是我的三个线程试图同时打印,弄乱了我的输出。每次输出都不一样。

为了解决这个问题,我在每个无限循环中添加了 1 秒的延迟,这在很大程度上解决了这个问题。但是,每次运行时,一行都应该在另一行之前执行(下面会进一步解释)。

我的理想输出是:

Calc1 Result: __
count1: __
Calc2 Result: __
count2: __
Calc3 Result: __
count3: __

并且永远重复这个

我的代码和不同输出的一些示例如下。

代码


#include <iostream>
#include <thread>

using namespace std;

void calc1(int num) {
    int count1 = 0;
    while (true) {
        printf(" Calc1 Result = %d\n",num + 1);
        ++count1;
        printf("count1 = %d\n",count1);
        this_thread::sleep_for(chrono::seconds(1));
    }

}

void calc2(int num) {
    int count2 = 0;
    while (true) {
        printf(" Calc2 Result = %d\n",num + 2);
        ++count2;
        printf("count2 = %d\n",count2);
        this_thread::sleep_for(chrono::seconds(1));
    }
}

void calc3(int num) {
    int count3 = 0;
    while (true) {
        printf(" Calc3 Result = %d\n",num + 3);
        ++count3;
        printf("count3 = %d\n",count3);
        this_thread::sleep_for(chrono::seconds(1));
    }
}

int main()
{
    thread one(calc1,25);
    thread two(calc2,50);
    thread three(calc3,100);

    
    one.join();
    two.join();
    three.join();

    
    return 0;
}

输出

有时输出以执行其中一个函数开始,有时以执行另一个函数开始。

例如,这里是 2 次不同运行的前 12 行输出

1. 这里的前 6 行是完美的。但是,在此输出的第 7-12 行中,Calc3 在 Calc1 和 Calc2 之前运行。

 Calc1 Result = 26
count1 = 1
 Calc2 Result = 52
count2 = 1
 Calc3 Result = 103
count3 = 1
 Calc3 Result = 103
 Calc1 Result = 26
count1 = 2
count3 = 2
 Calc2 Result = 52
count2 = 2

这里有三件事:

首先,输出与我的第一次运行不同。 (第1-6行相同,后面不同)

其次,循环再次以不需要的顺序运行。 Calc3 然后是 Calc2 然后是 Calc1 而不是 1 2 3。

第三,Calc3 和 Calc2 结果背靠背出现(第 7、8 行),但我想要的是每个循环背靠背出现的结果和计数。我知道这个特定问题可以通过组合结果和计数器 printf 语句来解决,但我更喜欢使用单独的 printf 语句。还有其他方法可以解决这个问题吗?

 Calc1 Result = 26
count1 = 1
 Calc2 Result = 52
count2 = 1
 Calc3 Result = 103
count3 = 1
 Calc3 Result = 103
 Calc2 Result = 52
count2 = 2
count3 = 2
 Calc1 Result = 26
count1 = 2

有谁知道这是否应该发生?如果是这样,为什么会发生这种情况?

另外,如果有任何推荐的资源(视频、书籍或文章),请链接它们。

提前致谢:D

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。