我对线程相对较新,而且我仍在学习最佳技术和C++ 11线程库。现在我正在实现一个无限循环的工作线程,执行一些工作。理想情况下,主线程会不时停止循环,以便与工作线程正在生成的信息同步,然后再次启动它。我最初的想法是这样的:停止从主线无限循环线程
// Code run by worker thread
void thread() {
while(run_) {
// Do lots of work
}
}
// Code run by main thread
void start() {
if (run_) return;
run_ = true;
// Start thread
}
void stop() {
if (!run_) return;
run_ = false;
// Join thread
}
// Somewhere else
volatile bool run_ = false;
我不能完全肯定这个,所以我开始研究,我发现,挥发性实际上并不需要同步,而且实际上通常是有害的。此外,我发现this answer,其中描述了一个几乎与我有关的过程相同的过程。然而,在答案的评论中,这种解决方案被描述为中断,因为易失性不能保证不同的处理器内核容易(如果有的话)在易失性值上传达更改。
我的问题是这样的:我应该使用原子标志,还是其他什么东西?究竟什么是缺乏易变性的财产,然后由需要什么构造来有效解决我的问题?
你的程序有一个数据竞争,所以确实是非常糟糕的。使用'std :: atomic'或类似的东西。 (也许是'std :: atomic_flag'。) –
@KerrekSB你能否解释为什么它有数据竞争?工作线程只读取共享变量,并且在线程运行时不访问任何数据。 – Svalorzen
因为语言是这样说的。你有多个访问,其中至少有一个是写入,而没有任何排序,并且内存位置不是'std :: atomic'。 –