创建/加入线程时的隐式同步

Implicit synchronization when creating/joining threads

本文关键字:同步 线程 创建      更新时间:2023-10-16

考虑到创建/加入线程时的隐含同步,x 的类型工作所需的最小成帧是多少:std::atomicvolatile ?无?

#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肯定是不够的(除非巧合)。