多线程读写atomic布尔变量时能否使用memory_order_relaxed?
结论
你的理解是正确的,当前场景下如果仅对_connected原子变量本身做读写、没有依赖该状态的其他跨线程共享内存操作,memory_order_relaxed完全足够。
原理说明
memory_order_relaxed的特性仅包含两点:
- 保证变量操作的原子性,不会出现读写撕裂、半值的情况
- 保证所有线程对该变量的修改遵循全局一致的修改顺序,不会读到逻辑上不可能存在的随机值
它和release/acquire等内存序的核心区别就是不提供跨变量的内存可见性同步,也就是不会保证该原子变量操作前后的其他内存操作对其他线程可见,刚好匹配你当前的需求。
需要换内存序的边界场景
如果后续你的逻辑有调整,出现如下依赖关系,就需要替换内存序:
connectedHandler()中在给_connected赋值前,有对连接相关的共享数据(比如收发缓冲区、连接上下文对象)的初始化操作- 其他线程在调用
isConnected()得到true的返回值后,会直接访问上述共享数据
这种场景下就需要把store改成std::memory_order_release,load改成std::memory_order_acquire,保证共享数据的初始化操作对读到_connected == true的线程可见,避免访问未初始化的脏数据。
内容的提问来源于stack exchange,提问作者someone serious
相关产品推荐
相关产品推荐

