首页 > 编程语言 >C++11原子变量:线程安全、无锁操作的实例解析

C++11原子变量:线程安全、无锁操作的实例解析

时间:2024-01-20 09:13:16浏览次数:23  
标签:11 std 无锁 变量 int C++ 原子 线程 操作

 

在 C++11 中,原子变量(std::atomic)提供了一种线程安全的方式来操作共享变量。下面是一个简单的例子,演示了C++11原子变量的用法。

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

std::atomic<int> counter(0); // 声明一个原子整数变量

void incrementCounter(int id, int iterations) {
    for (int i = 0; i < iterations; ++i) {
        counter++; // 原子操作,无需额外的锁
    }
}

int main() {
    const int numThreads = 5;
    const int iterationsPerThread = 100000;

    std::thread threads[numThreads];

    // 启动多个线程,每个线程增加计数器
    for (int i = 0; i < numThreads; ++i) {
        threads[i] = std::thread(incrementCounter, i, iterationsPerThread);
    }

    // 等待所有线程完成
    for (int i = 0; i < numThreads; ++i) {
        threads[i].join();
    }

    std::cout << "Final counter value: " << counter << std::endl;

    return 0;
}

注意事项:

  1. 原子性操作: 原子变量提供了原子性操作,避免了多线程同时访问共享变量时的竞争条件。
  2. 无锁: 使用原子变量的操作是无锁的,因此在高并发的情况下可以获得更好的性能。
  3. 适用类型: std::atomic 模板支持多种类型,例如整数、指针等。
  4. 适用操作: 可以使用各种操作符和成员函数进行原子操作,如 ++, --, +=, -=, =, exchange, compare_exchange_weak 等。
  5. 内存序: 可以指定内存序(memory order)来控制操作的同步顺序。

原理:

原子变量的实现通常涉及硬件级别的原子操作或使用操作系统提供的原子指令。在多线程环境下,这些操作保证了对变量的操作是原子的,不会被其他线程中断。在具体的实现中,可能使用了硬件指令(如 x86 的 lock 前缀指令)或者操作系统提供的原子操作函数。

需要注意的是,虽然原子变量提供了一些程度上的线程安全性,但在设计多线程程序时,仍需注意整体的线程安全性,例如避免竞争条件和死锁。

 

标签:11,std,无锁,变量,int,C++,原子,线程,操作
From: https://www.cnblogs.com/hanbing81868164/p/17976009

相关文章

  • C++ opencv计算两个cv::Rect的重复面积
    C++ opencv计算两个cv::Rect的重复面积  #include<opencv2/opencv.hpp>#include<iostream>intmain(){//创建两个矩形cv::Rectrect1(10,10,50,50);//(x,y,width,height)cv::Rectrect2(30,30,50,50);//检查两个矩形是否重叠......
  • c++函数默认参数及占位参数
    一.函数默认参数在c++中,函数形参列表中的形参是可以有默认值的语法:如果我们自己传入数据,就用自己的数据,如果没有,就用默认值注意:1.如果某个位置参数有默认值,那么从这个位置往后,从左往右,必须都要有默认值2.如果函数声明有默认值,函数实现的时候就不能有默认参数。(声明和实现只......
  • c++引用
    一.引用的基本使用作用:给变量起别名语法:数据类型&别名=原名二.引用注意事项引用必须初始化引用在初始化后,不可以改变三.引用做函数参数作用:函数传参时,可以利用引用技术让形参修饰实参优点:可以简化指针修饰实参四.引用做函数返回值注意:1.不要返回局部变量的引用......
  • 浅谈C++简单前缀和实现
    浅谈前缀和2023.9.28\(tips:\)文章持续更新中,欢迎关注\(upd:\)文章从洛谷博客迁移至博客园(\(2024.1.19\))洛谷B3612【深进1.例1】求区间和题目大E:有一个内部元素个数为\(n\)的数组\(a\),现在有m次询问,求a[l]到a[r]之间所有元素的和朴素的做法:#include<iostream>usin......
  • Git必知必会基础(11):撤销操作
     本系列汇总,请查看这里:https://www.cnblogs.com/uncleyong/p/10854115.html数据准备 说明:下面对file的操作,都可以用通配符gitadd<file>...比如:gitadd*.txt gitrestore<file>...比如:gitrestore--staged*.txt 修改文件(已提交过,文件已在本地仓库中)撤销:对......
  • C++-类和对象(1)
    引言:C++语言兼容C语言的基础上,更多的是面向对象进行编程,即相较于事务处理的流程,更侧重于处理过程中涉及到的类以及对象。今天向大家分享C++中的类与对象相关知识。1.类的定义:常使用class关键字定义一个类:由两部分构成,分别是成员属性和成员函数。classclassName//类名{//成员......
  • $20240119$ 练习题解
    \(20240119\)练习题解CF472D通过尝试我们容易发现,与点\(1\)最近的点一定是直接儿子。我们要是把它作为突破点,那就成功了一半了。假设点\(2\)与点\(1\)最近,又假设我们可以用函数\(F(x)\)来确定\(x\)点的子树形态。那我们会发现如果我们还有剩余的节点,那么剩余的节点......
  • 寒假生活指导11
    importjsonimportjsonpathobj=json.load(open('073__爬虫_解析_jsonpath.json','r',encoding='utf-8'))#书店所有书的作者#author_list=jsonpath.jsonpath(obj,'$.store.book[*].author')#print(author_list)#所有的作者#author......
  • C++中对象作为函数参数进行传参
    在C++语言环境中,对象是类的一个实例。 有三种方式:1、直接使用对象作为函数参数,形参和实参是不同的对象,它们所占地址空间不同,因此形参的改变并不影响实参的值。2、传入指向对象的指针作为函数参数,所谓“传址调用”,就是在函数调用时使用实参对象的地址,形参和实参都指向同一个地......
  • Windows 11 version 23H2 中文版、英文版 (x64、ARM64) 下载 (updated Jan 2024)
    Windows11version23H2中文版、英文版(x64、ARM64)下载(updatedJan2024)Windows11,version23H2,2024年1月更新请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindows11目前版本所有的日期都按照I......