atomic_int

举报
无敌清风蓝 发表于 2023/06/13 13:52:40 2023/06/13
【摘要】 atomic_int

1.介绍

atomic_int 是一个原子类型,它可以在多线程环境中安全地进行读写操作,而不会出现数据竞争

可以把 atomic_int 想象成一个保险箱,多个人可以同时往里面存钱或取钱,但是每次只能有一个人操作,其他人必须等待。这样就可以保证每个人的操作都是安全的

2.例子

下面是一个简单的代码例子,演示了如何使用 atomic_int 来实现多线程安全的计数器:

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

std::atomic_int counter(0);

void increment(int n) {
    for (int i = 0; i < n; ++i) {
        ++counter;
    }
}

int main() {
    std::vector<std::thread> threads;
    for (int i = 0; i < 10; ++i) {
        threads.push_back(std::thread(increment, 1000));
    }

    for (auto& th : threads) {
        th.join();
    }

    std::cout << "Counter: " << counter << '\n';

    return 0;
}

这段代码创建了一个名为 counteratomic_int 类型的变量,它的初始值为0。increment 函数接受一个整数参数 n,表示需要对计数器进行递增的次数。在函数内部,有一个循环,每次循环都会对计数器进行递增操作。

main 函数中,首先创建了一个 threads 向量,用于存储线程对象。然后,使用循环创建了10个线程,每个线程都调用 increment 函数,并传入参数 1000,表示每个线程都需要对计数器进行1000次递增操作。

接下来,使用另一个循环等待所有线程执行完毕。最后,输出计数器的值。

由于计数器是一个 atomic_int 类型,所以每次递增操作都是原子的,不会出现数据竞争。因此,在所有线程执行完毕后,计数器的值应该为10000。

有人会对下面代码进行疑惑

for (auto& th : threads) {
        th.join();
    }

这段代码中的 for 循环用于等待所有线程执行完毕。join 函数会阻塞当前线程,直到被调用的线程执行完毕。在这个例子中,main 函数中的 for 循环会依次调用每个线程对象的 join 函数,等待所有线程执行完毕

这样做的目的是确保所有线程都完成了对计数器的递增操作,才输出计数器的最终值

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。