【发布时间】:2017-08-11 02:07:55
【问题描述】:
我尝试编写一个物理模拟程序。我使用两个线程,一个用于计算,一个用于 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% 的机会。虽然数据是循环写入的,但我认为这不是时间问题。
我觉得这很奇怪。猜猜出了什么问题?
【问题讨论】:
-
更准确地说,是同步问题(数据竞争)。您是否使用了适当的同步原语(互斥体、信号量...)?
-
乍一看,这听起来像是一个竞争条件
-
多线程编程真的很难。您不只是随便“同时运行两件事”。您必须非常仔细地考虑同步您的代码,并且这样做的结果必须在处理线程间通信的代码中可见。
-
@KerrekSB 权力越大,责任越大。 :)
-
@Scheddi:有一个相当不错的关于多线程的常见问题解答/Wiki:stackoverflow.com/questions/2118090/…。 @KlasLindbäck:但线程共享一个结构,其中一个成员
running看起来像一个标志。您根本不能使用volatile来保证对标志的读/写顺序与结构中任何其他成员的读/写完全有任何关系。
标签: c++ multithreading