vpo*_*yev 8 c++ multithreading memory-model language-lawyer
考虑到创建/加入线程时隐含的同步,该代码工作所需的最小框架是什么??没有?x
std::atomic
volatile
#include <thread>
#include <cassert>
int main() {
int x = 123; // ***
std::thread( [ & ] { assert( x == 123 ); x = 321; } ).join();
assert( x == 321 );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Dam*_*mon 11
对std::thread
构造函数的调用是同步的,并在调用线程函数(30.3.1.2/6)的副本之前发生.
thread::join
给出了类似的同步保证:线程的完成发生在join
返回之前(30.3.1.4/7).
您的代码创建一个线程并立即加入它.尽管您的lambda通过引用捕获,但没有并发(代码按顺序运行),并且提供的保证std::thread
确保您不需要任何特殊的框架来保护x
.断言永远不会失败.
假设您的代码片段不同,因此您实际上具有某种类型的并发访问权限,则必须使用std::atomic
或使用互斥锁.volatile
最明确的是不够(除了巧合).
归档时间: |
|
查看次数: |
336 次 |
最近记录: |