我刚刚开始阅读有关多线程的文章,并尝试用 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