atomic_int

简介: 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 函数,等待所有线程执行完毕

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

相关文章
|
存储 安全 数据库
【C++ 17 包裹器类 std::optional】“深入理解C++:std::optional的高级应用与原理
【C++ 17 包裹器类 std::optional】“深入理解C++:std::optional的高级应用与原理
1147 1
|
Java 数据库连接 Maven
springboot集成mybatis时提示找不到Mapper Bean
springboot集成mybatis时提示找不到Mapper Bean
|
7月前
|
JSON JavaScript 前端开发
Go语言JSON 序列化与反序列化 -《Go语言实战指南》
本文介绍了 Go 语言中使用 `encoding/json` 包实现 JSON 与数据结构之间的转换。内容涵盖序列化(`Marshal`)和反序列化(`Unmarshal`),包括基本示例、结构体字段标签的使用、控制字段行为的标签(如 `omitempty` 和 `-`)、处理 `map` 和切片、嵌套结构体序列化、反序列化未知结构(使用 `map[string]interface{}`)以及 JSON 数组的解析。最后通过表格总结了序列化与反序列化的方法及类型要求,帮助开发者快速掌握 JSON 数据处理技巧。
|
9月前
|
Windows
电脑网络图标消失了怎么办?3步教你找回,简单快捷!
当电脑网络图标消失,宽带和WiFi图标变成一个球时,可通过以下步骤解决:1. 使用快捷键`Win+R`输入`services.msc`进入服务管理器;2. 找到并启动Wired AutoConfig、WLAN AutoConfig和WLAN Direct服务,设置启动类型为自动;3. 重启电脑验证问题是否解决。此方法可恢复网络功能。
1048 0
|
存储 C语言
C enum(枚举)详解
在C语言中,`enum`(枚举类型)允许用户定义包含命名整数常量的数据类型,提高了代码的可读性和可维护性。通过关键字`enum`定义枚举,如`enum Color {RED, GREEN, BLUE}`。枚举值默认从0开始递增,也可自定义。枚举类型实际上是整型的别名,可用于简化代码并限制变量的具体取值范围。
662 15
|
存储 自然语言处理 数据库
UTF-8编码:打破字符编码的国界
UTF-8编码:打破字符编码的国界
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
监控 物联网 智能硬件
MQTT 持久会话与 Clean Session 详解
【2月更文挑战第17天】
1047 5
|
数据采集 安全 数据管理
医学实验室/检验管理系统(LIS系统)源码
LIS是集:申请、采样、核收、计费、检验、审核、发布、质控、耗材控制等检验科工作为一体的网络管理系统。LIS系统不仅是自动接收检验数据,打印检验报告,系统保存检验信息的工具,也是医生科研、诊疗的重要参考指标。
382 2