问题描述
我刚刚开始阅读有关多线程的文章,并尝试用 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 (将#修改为@)