互斥元

在读写数据前锁定,读写后解锁。

#include <mutex>
std::mutex m1;
m1.lock();
m1.unlock();

这样做有点麻烦,不符合面向对象的风格和RAII(资源获取就是初始化)的思路。c++、提供了std::lock_guard模板,在构造时会锁定传入的互斥元,析构时解锁相应的互斥元。

#include <mutex>
std::mutex m1;
void add(){std::lock_guard<std::mutex > g1(m1);do_sth();
}

锁和数据访问本质上时独立的,所以接口不能暴露被保护数据的指针。

只在初始化阶段进行保护

假如有一个构造起来很昂贵,但构造以后数据只读。c++提供了std::once_flag和std::call_once,每个线程都可以使用。到std::call_once返回时,指针会被摸一个线程初始化。

std::shared_ptr<int> int_ptr;
std::once_flag int_flag;
void init_int(){int_ptr.reset(new int);
}
void foo(){std::call_once(int_flag,init_int);//多个线程运行此函数,此处也只会被调用一次do_sth();
}

递归锁

c++多线程——数据共享相关推荐

  1. threadlocal使用_Java多线程数据共享神器ThreadLocal

    ThreadLocal内部结构和作用 从ThreadLocal源码中可以看到其提供了3个方法,分别是get/set/remove.维护了一个ThreadLocalMap的数据结构.在多线程环境下能正确 ...

  2. java面试题二十九 多线程数据共享问题

    1 编一个程序,实现2个线程对 j 变量自增, 2个线程对 j 变量自减 2 代码如下 public class TestThread {public static void main(String[ ...

  3. php进程间通信 yoc_续上篇Swoole多进程数据共享的问题

    原因 进程作为程序执行过程中资源分配的基本单位,拥有独立的地址空间,同一进程的线程可以共享本进程的全局变量,静态变量等数据和地址空间,但进程之间资源相互独立. 由于PHP语言不支持多线程,因此Swoo ...

  4. Java多线程并发——CAS和AQS

    多核CPU.多线程的场景下,一起学习Java如何保证程序原子性,有序性,以及数据完整性等特性. CAS Compare And Swap 原子操作,更新之前,比较期望值,如果是期望值的话,写数据,否则 ...

  5. 几种kafka多线程消费方式

    kafka API   https://kafka.apache.org/0100/javadoc/index.html?org/apache/kafka/clients/consumer/Kafka ...

  6. day26-多进程多线程

    day26 总结 多线程.py """ !./env python -*- coding: utf-8 -*- @Time: 2021/6/1 17:09 @Author ...

  7. py基础---多线程、多进程、协程

    目录 Python基础__线程.进程.协程 1.什么是线程(thread)? 2.什么是进程(process)? 3.进程和线程的区别 4.GIL全局解释器锁 5.多线程(threading模块) 6 ...

  8. Java基础21 多线程线程两种实现方式 锁

    一.多线程的概念 1.程序 :一个固定逻辑与数据的集合 就称为程序 例如淘宝 贪吃蛇小游戏 2.CPU: 中央处理器 主要用于协调程序与硬件进行配置的工作 3.并发与并行 1.并发(高并发) 在同一个 ...

  9. iOS多线程——概念与原理

    1. 进程的定义 进程是指在系统中正在运行的一个应用程序,在iOS系统中,每个进程之间都是独立的,每个进程都运行在其专用的且受保护的内存中. 2. 线程的定义 线程是进程的基本执行单元,一个进程的所有 ...

最新文章

  1. mysql 递归查出子级_Mysql选择递归获取具有多个级别的所有子级
  2. mysql重装要删注册表_Mysql重装问题—删除注册表
  3. RuntimeError: Given groups=1, weight of size [1, 1, 3, 3], expected input[1, 3, 1402, 1200] to have
  4. 深入理解 Flutter 的编译原理与优化
  5. c++中友元函数详解
  6. MyBatis复习(二):mybatis-config.xml核心配置文件
  7. C++之string字符串类再探究
  8. c语言一把钥匙只能开一把锁阅读答案,一把钥匙开一把锁阅读附答案
  9. java开发 网关_SpringCloud系列之网关(Gateway)应用篇
  10. Hierarchical clustering
  11. 安装@vue/cli脚手架又又又出问题啦!!!
  12. 基于VS2019+QT的Coin3D三维可视化库的安装预测测试
  13. 萤火小程序商城(YoShop)
  14. Android Studio 中 gradle 下载失败的解决办法
  15. 支持对抗样本防御的AI加速器架构设计
  16. 研华服务器显示不了全屏啊,ppt不能全屏显示怎么办 ppt全屏显示不了的解决方法...
  17. 读书笔记(一)——《许三观卖血记》
  18. 2017 Top 10 Web 应用安全威胁,你的企业正在经历哪些?
  19. 关于Storyboard故事板, Segue 的使用,storyboard的拆分
  20. finclip小程序运行机制与微信小程序运行机制

热门文章

  1. 双屏不同缩放比例_科技产品大赏,曲面、折叠手机之后,双屏电脑会是下一个趋势吗?...
  2. Button或者ImageButton的背景设为透明或者半透明
  3. 系统学习 TypeScript(五)——联合类型
  4. 访问某个xml的url并将网页转成字节流
  5. ORA-01502-对应的快速解决办法(索引或这类索引的分区处于不可用状态)
  6. java单人多人聊天_java简单多人聊天
  7. python中异或怎么算_python中的异或运算
  8. 2022-03-07 学习docker开发vue前端
  9. Qt5 for linux离线安装工具下载地址
  10. Metamaterials perform image compression before light reaches the sensor(微波成像,拍摄与压缩同步进行)