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 的修改都只对该线程可见。

C++保证线程安全的方式的更多相关文章

  1. iOS中保证线程安全的几种方式与性能对比

    来源:景铭巴巴 链接:http://www.jianshu.com/p/938d68ed832c 一.前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@synchronized. ...

  2. EF 保证线程内唯一 上下文的创建

    1.ef添加完这个对象,就会自动返回这个对象数据库的内容,比如下面这个表是自增ID 最后打印出来的ID  就是自增的结果 2.lambda 中怎么select * var userInfoList = ...

  3. 在JAVA中ArrayList如何保证线程安全

    [b]保证线程安全的三种方法:[/b]不要跨线程访问共享变量使共享变量是final类型的将共享变量的操作加上同步一开始就将类设计成线程安全的, 比在后期重新修复它,更容易.编写多线程程序, 首先保证它 ...

  4. iOS- 多线程中如何去保证线程安全

    一.前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@synchronized.NSLock.dispatch_semaphore.NSCondition.pthread_mut ...

  5. AtomicInteger保证线程安全的全局变量

    现有业务场景需要做一个线程间的全局变量,并且实现自增效果. 初始使用了volatile 来保证count的安全性,如下: import java.util.concurrent.ExecutorSer ...

  6. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  7. 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?(阿里面试)

    JVM内存结构,是很重要的知识,相信每一个静心准备过面试的程序员都可以清楚的把堆.栈.方法区等介绍的比较清楚. 上图,是一张在作者根据<Java虚拟机规范(Java SE 8)>中描述的J ...

  8. JAVA | Java对象的内存分配过程是如何保证线程安全的?

    JAVA | Java对象的内存分配过程是如何保证线程安全的? 专注于Java领域优质技术,欢迎关注 作者 l Hollis 来源 l Hollis(ID:hollischuang) JVM内存结构, ...

  9. Java并发编程(二)如何保证线程同时/交替执行

    第一篇文章中,我用如何保证线程顺序执行的例子作为Java并发系列的开胃菜.本篇我们依然不会有源码分析,而是用另外两个多线程的例子来引出Java.util.concurrent中的几个并发工具的用法. ...

  10. 多线程下C#如何保证线程安全?

    多线程编程相对于单线程会出现一个特有的问题,就是线程安全的问题.所谓的线程安全,就是如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是 ...

随机推荐

  1. SpringBoot自动化配置

    SpringBoot自动化配置 一.SpringBoot自动化配置原理 1.SpringBoot引导类注解介绍 在SpringBoot的启动引导类上有一个@SpringBootApplication注 ...

  2. yapi tag的问题,暂时只保留一个tag

    yapi 的tag是需要先在网页上建立好,如:

  3. 冰点还原 deep freeze 安装,招聘机试时用到

    官方地址:https://www.faronics.com https://www.bingdiancn.com/(也可以从这个网站下载,我是从这个网站下载的) 需求:招聘时 需要机试,需要做项目,为 ...

  4. MySQL8 查询优化新工具 Explain Analyze

    1.什么是Explain Analyze? Explain 是我们常用的查询分析工具,可以对查询语句的执行方式进行评估(并非实际的执行情况,可能与实际情况存在较大差距),给出很多有用的线索. Expl ...

  5. 使用SpeechRecognition进行语音识别

    操作系统 : CentOS7.7.1908_x64 gcc版本 :4.8.5 Python 版本 : 3.6.8 安装语音识别环境: virtualenv -p /usr/bin/python3 py ...

  6. MQTT-QoS与协议流程

    QoS的报文收发流程 QoS 0 最多交付一次,消息有可能丢失,最低的QoS等级,没有任何的机制,不需要等待确认和重传,只要保证消息发送,也可能到达不了接收端 QoS0消息发送流程: 发送端调用API ...

  7. 二进制文件转Hex和Wav文件转Hex的Java代码

    二进制文件转Hex 对于需要将二进制数据写入固件的场景(例如mp3文件), 需要将二进制文件表示为byte数组 import java.io.File; import java.io.FileInpu ...

  8. 优先队列(PriorityQueue)常用方法及简单案例

    1 前言 PriorityQueue是一种特殊的队列,满足队列的"队尾进.队头出"条件,但是每次插入或删除元素后,都对队列进行调整,使得队列始终构成最小堆(或最大堆).具体调整如下 ...

  9. 用Taro写一个微信小程序——版本升级

    一.升级 1.升级Taro CLI至最新版本 taro update self npm i -g @tarojs/cli 2.更新项目中 Taro 相关的依赖 taro update project ...

  10. React 组件之状态

    没有什么是不可能的,只是需要找到正确的方法. 1. 什么是状态? 状态就是组件内部特有数据的载体(组件数据挂载方式),改变数据页面就会刷新,由组件自己设置和更改,也就是说由组件自己产生.维护,使用状态 ...