std:: atomic_wait, std:: atomic_wait_explicit
|
定义于头文件
<atomic>
|
||
|
template
<
class
T
>
void
atomic_wait
(
const
std::
atomic
<
T
>
*
object,
|
(1) | (C++20 起) |
|
template
<
class
T
>
void
atomic_wait
(
const
volatile
std::
atomic
<
T
>
*
object,
|
(2) | (C++20 起) |
|
template
<
class
T
>
void
atomic_wait_explicit
(
const
std::
atomic
<
T
>
*
object,
|
(3) | (C++20 起) |
|
template
<
class
T
>
void
atomic_wait_explicit
(
const
volatile
std::
atomic
<
T
>
*
object,
|
(4) | (C++20 起) |
执行原子等待操作。行为表现为重复执行以下步骤:
-
将
object
-
>
load
(
)
(针对重载
(1,2)
)或
object
-
>
load
(
order
)
(针对重载
(3,4)
)的值表示与
old
进行比较。
- 若二者按位相等,则阻塞直至 * object 被 std::atomic::notify_one() 或 std::atomic::notify_all() 通知,或线程被伪唤醒。
- 否则立即返回。
这些函数保证仅在值发生变化时返回,即使底层实现出现伪唤醒。
目录 |
参数
| object | - | 指向待检查等待的原子对象的指针 |
| old | - | 用于检查原子对象是否不再包含该值 |
| order | - | 内存同步排序方式 |
返回值
(无)
注释
这种变更检测形式通常比简单轮询或纯自旋锁更高效。
由于 ABA问题 ,从 old 到其他值再回到 old 的瞬时变化可能被遗漏,导致无法解除阻塞。
比较是按位进行的(类似于 std::memcmp );不使用比较运算符。永远不会参与对象值表示的填充位将被忽略。
示例
|
本节内容不完整
原因:缺少示例 |
参见
|
(C++20)
|
阻塞线程直至被通知且原子值发生变化
(
std::atomic<T>
的公开成员函数)
|
|
(C++20)
|
通知至少一个在原子对象上等待的线程
(
std::atomic<T>
的公开成员函数)
|
|
(C++20)
|
通知所有在原子对象上阻塞等待的线程
(
std::atomic<T>
的公开成员函数)
|
|
(C++20)
|
通知在 atomic_wait 中阻塞的线程
(函数模板) |
|
(C++20)
|
通知所有在 atomic_wait 中阻塞的线程
(函数模板) |