Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;在多线程中打印/不能重叠?_C++_Multithreading_Printing_Cout - Fatal编程技术网

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,则不会中断这些语句的执行。打印时,您应该使用这些语句来停止其他线程。这里有一个很好的示例:


    问题在于,测试和设置
    打印
    变量的语句不是原子的,也就是说,如果没有被切换到