<atomic> 注释11:wins 平台函数 _InterlockedIncrement ()、_InterlockedDecrement ()

(31)**wins 平台函数 _InterlockedIncrement ( ) 与 _InterlockedDecrement () ** , 虽然目前,在 《atomic》头文件里还没有出现,也一并学习了。这俩函数可以原子性的递增或递减一个变量的值

在这里插入图片描述
在这里插入图片描述

++ 测试:

在这里插入图片描述

(32)

谢谢

### 正确使用 `std::atomic` 的 `store` 方法及 `std::memory_order_relaxed` 在 C++11 中,`std::atomic` 类型提供了线程安全的操作机制。其中,`store` 方法允许将一个值写入到原子变量中,并可以通过指定不同的内存顺序参数(如 `std::memory_order_relaxed`)来优化性能。 #### `std::atomic::store` 方法简介 `std::atomic::store` 是一种用于向原子对象写入新值的方法。它的语法形式如下: ```cpp void store(T desired, std::memory_order order = std::memory_order_seq_cst) noexcept; ``` - 参数 `desired` 表示希望存储的新值。 - 参数 `order` 定义了执行此操作时所需的内存顺序,默认为 `std::memory_order_seq_cst`(全局序列化)。为了提高性能,可以根据需求选择更弱的内存顺序,例如 `std::memory_order_relaxed`[^2]。 当使用 `std::memory_order_relaxed` 作为内存顺序时,表示该操作不会引入任何同步或排序约束。这意味着它既不会阻止其他线程观察到不同步的状态变化,也不会影响其他非原子变量之间的可见性关系。因此,只有在确实不需要考虑与其他操作交互的情况下才应选用这种模式。 --- ### 示例代码展示 下面给出一段简单示例说明如何正确运用带有 `std::memory_order_relaxed` 的 `std::atomic::store` 函数: ```cpp #include <iostream> #include <atomic> #include <thread> std::atomic<int> counter(0); void increment_counter() { // 使用 relaxed 内存顺序进行增量操作 int current_value = counter.load(std::memory_order_relaxed); while(!counter.compare_exchange_weak(current_value, current_value + 1, std::memory_order_relaxed)); } int main() { const size_t thread_count = 10; std::vector<std::thread> threads; for(size_t i = 0; i < thread_count; ++i){ threads.emplace_back(increment_counter); } for(auto& th : threads){ if(th.joinable()) th.join(); } std::cout << "Final Counter Value: " << counter.load(std::memory_order_relaxed) << "\n"; return 0; } ``` 在这个例子中,多个线程同时尝试对同一个共享资源——即整数类型的 `counter` ——实施加法运算。由于这里并不涉及复杂的同步条件,所以我们可以放心大胆地采用 `std::memory_order_relaxed` 来提升效率[^3]。 注意:尽管上面的例子采用了 `compare_exchange_weak` 配合 `relaxed` 订单位实现了自增功能,但这实际上是一个复合动作而非单纯的储存行为;真正的单一储存案例会在下一个部分讨论。 --- ### 单纯储存实例 如果我们只是单纯想把某个固定数值放进原子变量里而不关心别的事情的话,那么可以直接调用 `store` 方法即可: ```cpp #include <iostream> #include <atomic> std::atomic<bool> flag(false); void set_flag_to_true(){ flag.store(true,std::memory_order_relaxed); } int main(){ set_flag_to_true(); bool result=flag.load(std::memory_order_relaxed); std::cout<<"Flag's state:"<<result<<"\n"; return 0; } ``` 在此处,我们创建了一个布尔类型的原子变量 `flag` ,并通过另一个独立函数将其设定成真状态。整个过程中没有任何潜在竞争状况存在,故而完全可以利用 `std::memory_order_relaxed` 达成目的[^1]。 --- ### 性能考量与注意事项 虽然 `std::memory_order_relaxed` 能够带来一定的性能优势,但它也伴随着风险。程序员必须清楚理解自己的应用场景是否真的可以容忍如此松散的行为准则。一旦误用了不当级别的记忆体定序,则可能导致难以察觉却极其严重的 bug 。所以在实际开发当中应当谨慎评估后再做决定。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzhangkeji

谢谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值