创建/加入线程时的隐式同步
Implicit synchronization when creating/joining threads
考虑到创建/加入线程时的隐含同步,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;
}
std::thread
构造函数的调用是同步的,并且发生在调用线程函数的副本之前 (30.3.1.2/6)。
thread::join
提供了类似的同步保证:线程的完成发生在join
返回 (30.3.1.4/7) 之前。
代码创建一个线程并立即加入它。尽管您的 lambda 通过引用捕获,但没有并发性(代码按顺序运行),并且 std::thread
提供的保证确保您不需要任何特殊的框架来保护x
。断言永远不会失败。
假设您的代码片段不同,因此您实际上具有某种并发访问,则必须使用 std::atomic
或互斥锁。 volatile
肯定是不够的(除非巧合)。
相关文章:
- 在C++中同步线程
- 将 10 个线程与原子布尔值同步
- 线程过程中的线程同步问题
- 如何定期同步线程?
- 同步线程安全的API,用于暴露缓存数据
- 如何在 pthreads 中正确同步线程
- 通过shared_ptr同步:线程清理器误报
- 如何同步线程以捕获相同数量的帧
- 同步线程和信号
- 使用条件变量(监视器)同步线程
- 同步线程创建和销毁(静态)对象
- NVIDA的CUDA"__syncthreads()"在传统C++中的等价物是什么。如何专业地同步线程?
- 使用事件同步线程
- 如何同步线程(消费者/生产者)
- 以最优雅的方式同步线程
- 使用互斥锁同步线程
- 计算着色器-如何全局同步线程
- GPU for loops:避免扭曲发散和隐式同步线程
- 如果已知访问顺序是安全的,如何在没有互斥锁的情况下同步线程/CPU
- Qt - 同步线程不起作用 - 线程停止但实际上不会停止,有时在不应该停止的时候停止