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>

#include <iostream>
#include <thread>
#include <atomic>
#include <vector>

std::atomic<int> counter(0); // 原子整数初始化为0

void increment(int num_iterations) {
    for (int i = 0; i < num_iterations; ++i) {
        counter++; // 安全地递增
    }
}

int main() {
    const int num_threads = 10;
    const int increments_per_thread = 1000;

    std::vector<std::thread> threads;

    // 创建并启动多个线程
    for (int i = 0; i < num_threads; ++i) {
        threads.emplace_back(increment, increments_per_thread);
    }

    // 等待所有线程完成
    for (auto& thread : threads) {
        thread.join();
    }

    // 输出最终计数值
    std::cout << "Final counter value: " << counter.load() << std::endl;

    return 0;
}

示例说明

  • 在这个例子中,我们创建了一个原子计数器 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

注册

已经有帐号?