[英]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调度程序中断的情况下执行。 您应该使用互斥锁以便在打印时停止其他线程。 这里有一个很好的例子:
你有一个竞争条件,其中两个(或更多)线程都可以设置printing
到true
。
这是因为赋值不是原子操作,它是由CPU分多个步骤完成的,并且如果在将变量的实际设置为true
之前中断了该线程,并且另一个线程开始运行,那么您可以让两个线程同时运行相信变量是true
。 为了更清楚:
printing
false
printing
false
printing
设置为true
printing
设置为true
现在,线程A和B都在全速运行。
这就是为什么有线程基元(例如, 信号量和互斥 量)来处理这些事情的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.