C++ C++;在多线程中打印/不能重叠?
我想知道使用多线程时如何处理打印。C++ C++;在多线程中打印/不能重叠?,c++,multithreading,printing,cout,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 = (s
我想这很简单:
#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;
}
#包括
#包括
使用名称空间std;
布尔打印=假;
结构参数结构{
INTA;
浮球b;
};
void*线程函数(void*参数){
结构参数struct*args=(结构参数struct argumentStruct*)参数;
INTA=args->a;
浮动b=args->b;
当(打印){}
打印=正确;
cout您有一个争用条件,其中两个(或更多)线程都可以将打印设置为true
这是因为赋值不是一个原子操作,它是由CPU分多个步骤完成的,如果线程在变量实际设置为true
之前被中断,而另一个线程开始运行,那么您可以让两个线程同时运行,这两个线程都相信变量是true
。为了更清楚起见:
线程A看到打印
为假
线程A被中断
线程B开始运行
线程B看到打印
为假
线程B将打印设置为true
线程B被中断
线程A已调度并再次开始运行
线程A将打印设置为true
现在线程A和B都在全速前进
这就是为什么有处理这些事情的线程原语,如信号量和互斥量。您有一个竞争条件,其中两个(或更多)线程都可以将打印设置为真
这是因为赋值不是一个原子操作,它是由CPU分多个步骤完成的,如果线程在变量实际设置为true
之前被中断,而另一个线程开始运行,那么您可以让两个线程同时运行,这两个线程都相信变量是true
。为了更清楚起见:
线程A看到打印
为假
线程A被中断
线程B开始运行
线程B看到打印
为假
线程B将打印设置为true
线程B被中断
线程A已调度并再次开始运行
线程A将打印设置为true
现在线程A和B都在全速前进
这就是为什么有处理这些事情的线程原语,如信号量和互斥量。您有一个竞争条件,其中两个(或更多)线程都可以将打印设置为真
这是因为赋值不是一个原子操作,它是由CPU分多个步骤完成的,如果线程在变量实际设置为true
之前被中断,而另一个线程开始运行,那么您可以让两个线程同时运行,这两个线程都相信变量是true
。为了更清楚起见:
线程A看到打印
为假
线程A被中断
线程B开始运行
线程B看到打印
为假
线程B将打印设置为true
线程B被中断
线程A已调度并再次开始运行
线程A将打印设置为true
现在线程A和B都在全速前进
这就是为什么有处理这些事情的线程原语,如信号量和互斥量。您有一个竞争条件,其中两个(或更多)线程都可以将打印设置为真
这是因为赋值不是一个原子操作,它是由CPU分多个步骤完成的,如果线程在变量实际设置为true
之前被中断,而另一个线程开始运行,那么您可以让两个线程同时运行,这两个线程都相信变量是true
。为了更清楚起见:
线程A看到打印
为假
线程A被中断
线程B开始运行
线程B看到打印
为假
线程B将打印设置为true
线程B被中断
线程A已调度并再次开始运行
线程A将打印设置为true
现在线程A和B都在全速前进
这就是为什么会有处理这些事情的线程原语,如信号量和互斥量。问题是,测试和设置打印变量的语句不是原子的,也就是说,它们在执行时会被在线程之间切换CPU的操作系统调度程序中断。您应该告诉我们以停止打印时的其他线程。这里有一个很好的示例:
问题在于,测试和设置<代码>打印
变量的语句不是原子的,也就是说,如果操作系统调度程序在线程之间切换CPU,则不会中断这些语句的执行。打印时,您应该使用这些语句来停止其他线程。这里有一个很好的示例:
问题在于,测试和设置<代码>打印
变量的语句不是原子的,也就是说,如果操作系统调度程序在线程之间切换CPU,则不会中断这些语句的执行。打印时,您应该使用这些语句来停止其他线程。这里有一个很好的示例:
问题在于,测试和设置打印变量的语句不是原子的,也就是说,如果没有被切换到