繁体   English   中英

C ++打印/裁剪在多线程中重叠吗?

[英]C++ Printing/cout overlaps in multithreading?

我想知道使用多个线程时如何处理打印。
我认为这将非常简单:

#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;
}

但这并不能很好地工作。 一些提示只是被跳过(或可能被覆盖?)。
那我在做什么错? 我该如何正确处理?

问题在于测试和设置printing变量的语句不是原子的 ,也就是说,它们不会在不被线程间切换CPU的OS调度程序中断的情况下执行。 您应该使用互斥锁以便在打印时停止其他线程。 这里有一个很好的例子:

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

你有一个竞争条件,其中两个(或更多)线程都可以设置printingtrue

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

  1. 线程A看到printing false
  2. 线程A被中断
  3. 线程B开始运行
  4. 线程B看到printing false
  5. 线程B将printing设置为true
  6. 线程B被中断
  7. 线程A已排定并再次开始运行
  8. 线程A将printing设置为true

现在,线程A和B都在全速运行。

这就是为什么有线程基元(例如, 信号量互斥 量)来处理这些事情的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM