繁体   English   中英

线程之间的数据交换

[英]Data exchange between threads

我尝试编写一个用于物理模拟的程序。 我使用两个线程,一个用于计算,一个用于gui。 为了在它们之间交换数据,我使用了一个结构

struct sim_data {  
     int running;  
     int steps;  
    int progress;  
 ...  
};

并将其包含在不同的线程中

void *sim(void *args) {  
    struct sim_data *my_data;  
    my_data=(struct sim_data *)args;  
    ...  
}

设定值时

my_data->progress=1000;

数据在同一线程中可用,但在第二个线程中不可靠。 当启动程序在第二个线程中读取一个不同的值然后在第一个线程中写入一个值时,我猜想有10%的机会。 虽然数据是循环写入的,但我认为这不是时序问题。

我觉得这很奇怪。 你猜怎么了?

C ++ 11规范将数据争用情况声明为一个线程写入某个位置而第二个线程可以读取或写入同一位置的任何时间。 它声明您在发生这种情况时得到未定义的行为。 在您的情况下,一个线程正在写入my_data-> progress,而另一个正在读取它。

解决方案是使用同步,例如原子整数或锁定。

C ++编译器做了非常出色的优化,以使您的单线程程序运行得更快。 例如,它可能证明,在单线程环境中,无法看到1000值,而只是选择不打印它。

还有更多丑陋的案件是合法的。 如果编译器知道您要存储1000,则可以选择根本不存储任何内容,而是使用该内存作为空间将临时结果“溢出”到其中,而不是在最终存储1000之前分配更多的空间。同时,您可以读取任意值。

对于该问题的幽默观点,请访问: http : //software.intel.com/zh-cn/blogs/2013/01/06/benign-data-races-what-c​​ould-possfully-go-wrong

最简单的解决方案:

struct sim_data {  
     int running;  
     int steps;  
     atomic<int> progress;  //this will guarantee the data are coherent between two threads
 ...  
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM