Standard C++ atomic_flag的notify_one唤醒公平性及wait后的lock free疑问
关于Standard C++ atomic_flag的两个问题解答
1. notify_one()唤醒wait()线程的顺序公平性
C++标准没有强制规定atomic_flag的notify_one()必须按照FIFO(先进先出)顺序唤醒等待的线程。实现可以采用任意唤醒策略:可能是随机挑选等待线程,或者基于线程优先级,甚至是依赖操作系统底层调度的其他方式。
如果你的场景需要严格的公平性保证,atomic_flag的wait/notify机制无法满足需求——这类场景通常需要使用带有公平性选项的同步原语(比如指定std::mutex::fair的互斥锁搭配std::condition_variable),但这类组件往往会带来明显的性能开销,这也是你之前替换为atomic_flag后性能极佳的核心原因。
2. wait()是否会破坏atomic_flag的无锁特性
atomic_flag被C++标准强制要求为always lock free,其核心原子操作(test_and_set()、clear()等)在任何实现中都不需要依赖互斥锁。而wait()和notify_*()的实现,本质是基于操作系统的线程阻塞/唤醒机制(比如Linux的futex、Windows的事件对象),这些机制并不会引入互斥锁的开销,也不会要求后台内存分配(标准未要求,主流实现也不会这么做)。
换句话说,atomic_flag的无锁特性针对的是其原子操作本身,wait()只是让线程进入休眠等待状态,不会破坏它的无锁属性,也不会带来你担心的额外内存分配开销。
内容的提问来源于stack exchange,提问作者Walter
相关产品推荐
相关产品推荐

