gpt4 book ai didi

c++ - 线程间的数据交换

转载 作者:太空宇宙 更新时间:2023-11-04 11:56:54 25 4
gpt4 key购买 nike

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

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/en-us/blogs/2013/01/06/benign-data-races-what-could-possibly-go-wrong

关于c++ - 线程间的数据交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15874034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com