我想知道在使用多个线程时如何处理打印 我认为这很简单:
#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只是被跳过(或者可能被覆盖?) 那么我做错了什么?我该如何妥善处理?
答案 0 :(得分:2)
问题是测试和设置printing
变量的语句不是原子,即它们不会被OS调度程序中断而不会被切换到线程中的CPU。您应该使用mutexes以便在打印时停止其他线程。这里有一个很好的例子:
答案 1 :(得分:1)
您有竞争条件,其中两个(或更多)线程都可以将printing
设置为true
。
这是因为赋值不是原子操作,它是由CPU在多个步骤中完成的,并且如果在将变量实际设置为true
之前线程被中断,并且另一个线程开始运行,然后你可以同时运行两个线程,两个线程都相信变量是true
。为了更清晰:
printing
为false
printing
是false
printing
设置为true
printing
设置为true
现在线程A和B都在全速前进。
这就是为什么有一些线程原语,如信号量和互斥来处理这些事情。