首页 > 其他分享 >原子操作atomic

原子操作atomic

时间:2024-01-23 13:33:06浏览次数:25  
标签:std 变量 原子 atomic operator 操作

目录


简介

在 C++11 中,std::atomic是一个用于原子操作的类模板。它提供了原子的读-改-写操作,以确保在多线程环境下对共享变量的操作是线程安全的。

std::atomic的主要用途是对共享变量进行原子操作,例如递增、递减、赋值等。它可以用于实现线程安全的数据结构、计数器、信号量等。

下面是一个简单的示例,展示了如何使用std::atomic

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

std::atomic<int> count(0);

void increment()
{
    count++;
}

int main()
{
    std::thread t1(increment);
    std::thread t2(increment);

    t1.join();
    t2.join();

    std::cout << "Count: " << count << std::endl;

    return 0;
}

在上面的示例中,我们创建了一个std::atomic<int>类型的变量count,初始值为 0。然后,我们创建了两个线程t1t2,它们都调用increment函数对count进行递增操作。

由于std::atomic保证了原子性,所以在多线程环境下,count的值将被正确地递增,而不会出现竞态条件或数据不一致的问题。

std::atomic还提供了其他成员函数,例如operator++()operator--()operator=()等,用于进行各种原子操作。


成员函数

std::atomic类提供了一些成员函数,用于执行原子操作。这些函数在 C++11 中可用,用于多线程环境下对共享变量进行操作。

以下是std::atomic类的一些常见成员函数:

  1. operator++():递增原子变量。

  2. operator--():递减原子变量。

  3. operator=():赋值原子变量。

  4. operator==():比较原子变量与另一个值是否相等。

  5. operator!=():比较原子变量与另一个值是否不相等。

  6. fetch_add():原子地将一个值添加到原子变量中。

  7. fetch_sub():原子地从原子变量中减去一个值。

  8. fetch_or():原子地将一个值或操作原子变量的值。

  9. fetch_and():原子地将一个值与操作原子变量的值。

  10. fetch_xor():原子地异或操作原子变量的值。

  11. exchange():原子地交换原子变量的值。

  12. compare_exchange_weak():原子地比较并交换原子变量的值(如果相等)。

  13. compare_exchange_strong():原子地比较并交换原子变量的值(如果相等),具有更强的顺序保证。

这些成员函数提供了原子性的读-改-写操作,确保在多线程环境下对共享变量的操作是线程安全的。它们避免了竞态条件和数据不一致的问题。

标签:std,变量,原子,atomic,operator,操作
From: https://www.cnblogs.com/yubo-guan/p/17982255

相关文章

  • C# 对数值进行与,或,异或操作的学习理解
    //&符号是and,与,一个为0都是0,全部为1才是1//1&1=1,1&0=0,1与任何数都是任何数//0&1=0,0&0=0,0与任何数都是0varnum1=0b_1010_1010_1010;varnum2=0b_1111_0000;//保留num1二进制中4-7位Conso......
  • css变量基本操作
    1.html中css变量写法<divstyle="--color:#ccc;"><spanstyle="border:1pxsolidvar(--color);"></div><ul><listyle="--i:1"></li><listyle="--i:2"></li>......
  • go对I/O操作进行限流
    go对io操作进行限流起因是我对大文件进行切片的时候,先去获取了文件的MD5,读取文件的过程中把我所有的磁盘io吃满了,卡的要死,然后就突然想到了对io进行限流;因为我现在做的需求以后是有可能放在后台运行的.使用的一个三方库,可以对诸如io.Reader和io.Writer进行限流;go......
  • 操作系统学习
    操作系统是什么是一种软件,提供给用户和其他上层软件方便的接口和环境!!!系统资源的管理者提供处理机(CPU)、存储器、文件、设备管理打开QQ--相关数据放入内存--进程被CPU处理--视频通话(摄像头设备)向上层提供方便易用的服务GUI(图形用户接口)比如window下拖拽......
  • JavaScript DOM表单相关操作之表单相关事件
    1、焦点事件焦点事件就是鼠标的光标事件,点到输入框中,叫做获得焦点事件,当鼠标离开这个输入框时叫做失去焦点事件。​<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head><body><form><h3>......
  • JavaScript DOM表单相关操作之获取表单数据的方式
    在与表单相关的操作中,我们用的最多的就是获取表单中的数据。想要获取指定输入框的数据,首先就需要获取到这个输入框对象。1、通过id属性获取表单数据​<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head......
  • 一文读懂JavaScript DOM节点操作(JavaScript DOM节点操作详解)
    一、什么是节点DOM模型是树状结构模型,二组成这棵树的就是一个个点,在网络术语中称之为节点。节点是一个模型中最基本的组成单位。DOM模型是由一个个节点组成的,DOM节点也有其不同的类型。二、节点类型DOM节点分为5种类型:文档节点(就是整个HTML文档,也就是document对象)元素节点......
  • JavaScript DOM表单相关操作之表单相关事件
    1、焦点事件焦点事件就是鼠标的光标事件,点到输入框中,叫做获得焦点事件,当鼠标离开这个输入框时叫做失去焦点事件。<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head><body><form><h3>输......
  • JavaScript DOM表单相关操作之获取表单数据的方式
    在与表单相关的操作中,我们用的最多的就是获取表单中的数据。想要获取指定输入框的数据,首先就需要获取到这个输入框对象。1、通过id属性获取表单数据<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>知数SEO_专注搜索引擎优化和品牌推广</title></head>......
  • 操作系统学习 第一章 概述
    操作系统第一章概述1.1操作系统的定义操作系统是一个控制软件-管理应用程序-为应用程序提供服务-杀死应用程序-资源管理-管理外设/分配资源(1)在操作系统下,进程\(\Longleftrightarrow\)CPU,文件\(\Longleftrightarrow\)磁盘,地址空间\(\Longleftrightarrow\)内存(2)操作系......