首页 > 编程语言 >C++保证线程安全的方式

C++保证线程安全的方式

时间:2024-03-07 20:01:23浏览次数:31  
标签:std 线程 C++ 互斥 保证 shared var mutex

1、互斥量

可以确保同一时间只有一个线程访问临界区,防止出现竞态条件。

2、原子操作

std::atomic<int> mutex(1);

对原子变量的操作是线程安全的。

3、读写锁

std::shared_mutex mutex;
// 读者:共享锁定
mutex.lock_shared();
mutex.unlock_shared();

//写者:独占锁定
mutex.lock();
mutex.unlock();

4、条件变量

配合互斥锁工作。见经典同步问题及其伪代码实现 - hellozhangjz - 博客园 (cnblogs.com)

5、线程本地存储

#include <iostream>
#include <thread>
thread_local int var = 0;  // 线程本地变量

void incrementCounter()
{
    ++var;
    std::cout << std::this_thread::get_id() << ": " << var << std::endl;
}

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

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

    return 0;
}

每个线程都有一个var 备份并且每个线程对 var 的修改都只对该线程可见。

标签:std,线程,C++,互斥,保证,shared,var,mutex
From: https://www.cnblogs.com/hellozhangjz/p/18059642

相关文章

  • c/c++指针中 * 和 & 的区别与联系
    在C语言中,*和&是两个非常基础但功能相反的操作符,它们分别是解引用(dereference)操作符和取地址(address-of)操作符。&(取地址操作符)用途:&操作符用来获取变量的内存地址。示例:假设有一个整型变量intx=10;,则&x表示获取变量x的内存地址。如果你有一个指针变量想要存储变量x的地址,可......
  • 进程和线程
    进程的概念,组成和特征进程状态转换进程控制进程通信......
  • C#-关于多线程下锁的使用,提高共享资源利用率的问题思考
    前一段时间阅读某公司项目的代码,发现类的单例模式无处不在,为了控制单例全局对象属性跨线程访问到处加锁,由于每个研发人员技术及业务水平参差不齐,锁的控制范围可能会扩大化,真正需要锁住的变量利用率降低。举例:全局变量intCount=0;定义锁对象objectCountLocker=newObject......
  • 多线程系列(十五) -常用并发工具类详解
    一、摘要在前几篇文章中,我们讲到了线程、线程池、BlockingQueue等核心组件,其实JDK给开发者还提供了比synchronized更加高级的线程同步组件,比如CountDownLatch、CyclicBarrier、Semaphore、Exchanger等并发工具类。下面我们一起来了解一下这些常用的并发工具类!二、常用并发......
  • C++语言代码开发示例-身份证实名认证接口
    实名认证API实时联网核验个人身份信息与所持身份证件人员的一致性,可满足不同应用场景的不同实名认证需求,如身份证号+姓名核验、身份证号+姓名+人像核验、身份证号+姓名+证件人像+现场人像核验等,有助于推动诚信网络环境建设,降低利用网络进行违法犯罪的可能性,防止纠纷和诈骗,确保消费......
  • C++ 萃取机 Iterator Traits
    IteratorTraits萃取出Iterator的性质:迭代器种类、迭代器所指数据类型、迭代器距离类型、迭代器所指数据引用、迭代器所指数据指针。根据不同的迭代器种类可以采取不同的算法策略。但是用iter::interator_categotry、iter::value_type、iter::pointer...就可以访问到迭代器的......
  • 面试官让说出8种创建线程的方式,我只说了4种,然后挂了。。。
    写在开头昨天有个小伙伴私信说自己面试挂在了“Java有几种创建线程的方式”上,我问他怎么回答的,他说自己有背过八股文,回答了:继承Thread类、实现Runnable接口、实现Callable接口、使用线程池这四种,但是面试官让说出8种创建方式,他没说出来,面试就挂了,面试官给的理由是:只关注八股文背......
  • 03_C++基本数据类型_复合类型
    主要复合类型:引用和指针1.引用允许在一条语句中定义多个引用,其中每个引用标识符都必须以&开头。#include<iostream>usingnamespacestd;intmain(){intb;int&a=b;b=6;cout<<"a:"<<a<<endl;cout<<"b:"<......
  • [转]如果继承上一任的C++库
    转自微信公众号:CSDN原文链接:https://gaultier.github.io/blog/you_inherited_a_legacy_cpp_codebase_now_what.html作者|PhilippeGaultier译者|郑丽媛有时候,也许你刚换了一份新工作,也许刚换了一个团队,也许团队中某个有经验的人刚离开,这时需要你来继承一个旧的C++ 代码......
  • Qt/C++音视频开发68-检查是否含有B帧/转码推流/拉流显示/监控拉流推流/海康大华宇视监
    一、前言为什么需要判断视频文件是否含有B帧,这个在推流的时候很容易遇到这个问题,一般来说,没有B帧的视频文件,解码后的数据帧pts和dts都是顺序递增的,而有B帧的则未必,可能有些需要先解码后面显示,B帧也是双向预测图像B,对它的编码,即是对它前后帧的像素值之差进行编码,B帧是双向差别帧,也......