C ++ Printing / cout在多线程中重叠?

时间:2014-09-15 12:54:42

标签: c++ multithreading printing cout

我想知道在使用多个线程时如何处理打印 我认为这很简单:

#include <iostream>
#include <pthread.h>
using namespace std;

bool printing = false;

struct argumentStruct {
    int a;
    float b;
};

void *ThreadFunction(void *arguments) {
  struct argumentStruct*args = (struct argumentStruct*)arguments;
  int a = args->a;
  float b = args->b;
    while (printing) {}
    printing = true;
      cout << "Some text...." << a << b << endl;
    printing = false;
}

main() {
    pthread_t threads[3];
    struct argumentStruct argStruct[3];

    argStruct[0].a = 1;
    argStruct[0].b = 1.1;
    pthread_create(&threads[0], NULL, &ThreadFunction, (void *)&argStruct[0]);

    argStruct[1].a = 2;
    argStruct[1].b = 2.2;
    pthread_create(&threads[1], NULL, &ThreadFunction, (void *)&argStruct[1]);

    argStruct[2]a = 3;
    argStruct[2].b = 3.3;
    pthread_create(&threads[2], NULL, &ThreadFunction, (void *)&argStruct[2]);

    getchar();
    return 0;
}

但这并没有那么好用。一些cout只是被跳过(或者可能被覆盖?) 那么我做错了什么?我该如何妥善处理?

2 个答案:

答案 0 :(得分:2)

问题是测试和设置printing变量的语句不是原子,即它们不会被OS调度程序中断而不会被切换到线程中的CPU。您应该使用mutexes以便在打印时停止其他线程。这里有一个很好的例子:

http://sourcecookbook.com/en/recipes/70/basic-and-easy-pthread-mutex-lock-example-c-thread-synchronization

答案 1 :(得分:1)

您有竞争条件,其中两个(或更多)线程都可以将printing设置为true

这是因为赋值不是原子操作,它是由CPU在多个步骤中完成的,并且如果在将变量实际设置为true之前线程被中断,并且另一个线程开始运行,然后你可以同时运行两个线程,两个线程都相信变量是true。为了更清晰:

  1. 主题A看到printingfalse
  2. 线程A中断
  3. 线程B开始运行
  4. 主题B看到printingfalse
  5. 主题B将printing设置为true
  6. 线程B中断
  7. 线程A已安排并重新开始运行
  8. 主题A将printing设置为true
  9. 现在线程A和B都在全速前进。

    这就是为什么有一些线程原语,如信号量互斥来处理这些事情。