ZBLOG

std::atomic i = 0

std::atomic<int> i = 0; 是 C++11 中引入的原子类型,用于保证对变量的并发访问是安全的,特别是在多线程环境中。下面是有关 std::atomic 的一些基本信息和示例。

基本信息

  1. 原子性std::atomic 提供了一种方式来确保在多个线程之间对变量的访问是原子的,即不可分割的。这意味着,当一个线程正在读取或修改这个值时,其他线程不会看到部分更新。

  2. 使用场景:适用于需要简单锁定机制而不想使用传统互斥锁(如 std::mutex)来保护共享数据的情况,例如计数器、状态标志等。

  3. 性能:由于它减少了上下文切换和锁竞争,因此在某些情况下,使用 std::atomic 可以提高程序性能。

示例代码

以下是一个简单的示例,展示如何使用 std::atomic<int>

  1. #include <iostream>
  2. #include <thread>
  3. #include <atomic>
  4. #include <vector>
  5. std::atomic<int> counter(0); // 原子整数初始化为0
  6. void increment(int num_iterations) {
  7. for (int i = 0; i < num_iterations; ++i) {
  8. counter++; // 安全地递增
  9. }
  10. }
  11. int main() {
  12. const int num_threads = 10;
  13. const int increments_per_thread = 1000;
  14. std::vector<std::thread> threads;
  15. // 创建并启动多个线程
  16. for (int i = 0; i < num_threads; ++i) {
  17. threads.emplace_back(increment, increments_per_thread);
  18. }
  19. // 等待所有线程完成
  20. for (auto& thread : threads) {
  21. thread.join();
  22. }
  23. // 输出最终计数值
  24. std::cout << "Final counter value: " << counter.load() << std::endl;
  25. return 0;
  26. }

示例说明

  • 在这个例子中,我们创建了一个原子计数器 counter 并初始化为 0
  • 我们启动了 10 个线程,每个线程都执行 increment() 函数,该函数将计数器递增 1000 次。
  • 最后,我们输出最终的计数器值,它应该是 10000,因为我们有 10 个线程,每个线程都增加了计数器 1000 次。
  • 使用 counter++ 是安全的,因为这是一个原子操作,所以不需要额外的同步机制。

注意事项

  • 尽管 std::atomic 可以防止数据竞争,但它不提供完全的同步功能。例如,如果你需要执行复合操作(例如检查并更新),你仍然需要用其他机制(如互斥锁)来保护这些操作。
  • 对于复杂数据结构或更复杂的场景,可能会考虑使用其他并发控制机制。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23020

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?