std:: atomic_exchange, std:: atomic_exchange_explicit
|
定义于头文件
<atomic>
|
||
|
template
<
class
T
>
T atomic_exchange
(
std::
atomic
<
T
>
*
obj,
|
(1) | (C++11 起) |
|
template
<
class
T
>
T atomic_exchange
(
volatile
std::
atomic
<
T
>
*
obj,
|
(2) | (C++11 起) |
|
template
<
class
T
>
T atomic_exchange_explicit
(
std::
atomic
<
T
>
*
obj,
|
(3) | (C++11 起) |
|
template
<
class
T
>
T atomic_exchange_explicit
(
volatile
std::
atomic
<
T
>
*
obj,
|
(4) | (C++11 起) |
目录 |
参数
| obj | - | 指向要修改的原子对象的指针 |
| desired | - | 要存储到原子对象中的值 |
| order | - | 内存同步排序方式 |
返回值
原子对象先前持有的值,该原子对象由 obj 指向。
示例
自旋锁互斥量可以在用户空间通过原子交换操作实现,类似于 std:: atomic_flag_test_and_set :
#include <atomic> #include <iostream> #include <thread> #include <vector> std::atomic<bool> lock(false); // 值为true时表示已锁定 // 值为false时表示未锁定 int new_line{1}; // 通过原子锁变量实现同步访问 void f(int n) { for (int cnt = 0; cnt < 100; ++cnt) { while (std::atomic_exchange_explicit(&lock, true, std::memory_order_acquire)) ; // 自旋直到获取锁 std::cout << n << (new_line++ % 80 ? "" : "\n"); std::atomic_store_explicit(&lock, false, std::memory_order_release); } } int main() { std::vector<std::thread> v; for (int n = 0; n < 8; ++n) v.emplace_back(f, n); for (auto& t : v) t.join(); }
可能的输出:
02222222222222222222222002222222222222222222222222222222222222222222222222222222 22222222200022222222202222211111111111110000011111111100000000000000110001111111 00011111000001111110000011111100000111000000001111111111111110000010000001001111 11011111111011111011000000000000111100000000000001111000011133333333333333333333 33333333333333333333333333333333333333333333333333333333333333333333333333333333 44444444444444444444444444444444444444444444444444444444444444444444444444444444 44444444444444444444555555555555555555555555555555555555555555555555555555555555 55555555555555555555555555555555555555556666666666666666666666666666666666666666 66666666666666666666666666666666666666666666666666666666666677777777777777777777 77777777777777777777777777777777777777777777777777777777777777777777777777777777
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| DR | 适用范围 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| P0558R1 | C++11 |
由于
T
是从多个参数推导得出,因此需要精确类型匹配
|
T
仅从
obj 推导得出 |
参见
|
原子地替换原子对象的值并获取先前持有的值
(
std::atomic<T>
的公开成员函数)
|
|
|
原子地比较原子对象的值与非原子参数,若相等则执行原子交换,否则执行原子加载
(函数模板) |
|
(C++20 中弃用)
(C++26 中移除)
|
为
std::shared_ptr
特化的原子操作
(函数模板) |
|
C 文档
关于
atomic_exchange
,
atomic_exchange_explicit
|
|