我想知道如何在使用多线程时处理打印。
我认为这会很简单:
#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 被跳过(或者可能被覆盖?)。
那我做错了什么?我该如何正确处理这个问题?
最佳答案
问题在于测试和设置 printing
变量的语句不是原子,即它们不会在不被切换的操作系统调度程序中断的情况下执行线程之间的CPU。你应该使用 mutexes为了在打印时停止其他线程。这里有一个很好的例子:
关于C++ 打印/cout 在多线程中重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25848615/