5.0.2 阅读 libstdc++ 中原子变量 wait 和 notify 接口
Wait 和 notify 接口介绍
std::atomic<T>::wait
用来等待原子变量值的改变,如果原子变量值和给定的参数 old 相同则阻塞,直到被 notify_all()
或者 notify_one()
通知,或者自发地解除阻塞。因此用 wait
要在循环中使用。
// std::atomic<T>::wait
void wait( T old, std::memory_order order = std::memory_order_seq_cst ) const noexcept;
void wait( T old, std::memory_order order = std::memory_order_seq_cst ) const volatile noexcept;
Cppreference 上说这个接口通常比轮询和自旋锁更高效。看了一下 libstdc++ 的实现,实际上内部也是自旋锁,只是比我们在外面用自旋锁要高效一些。实现在 libstdc++-v3/include/bits/atomic_wait.h 文件中。
wait
的实现
调用链路(同一缩进下函数的调用不区分顺序,不表示前者在后者之前调用):
__atomic_wait_address_v
__detail::__waiter<std::true_type>::_M_do_wait_v
__detail::__waiter_pool::_M_do_spin_v 🔍
// do-while loop of:
__detail::__waiter_pool::_M_do_wait 🔍
// and
__detail::_S_do_spin_v
__detail::__atomic_spin 🔍