简单的多线程程序问题

时间:2021-07-01 18:57:49

标签: c++ multithreading visual-c++ thread-safety

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

0 个答案:

没有答案
相关问题