std::get<C++11多线程库~线程间共享数据>(09):共享数据带来的问题(1)

1 #include
 2
 3 /*
 4  * 话题1:线程间共享数据
 5  *      a. 共享数据带来的问题
 6  *      b. 使用互斥量保护数据
 7  *      c. 数据保护的替代方案
 8  *
 9  *      多个线程只读的访问某一个相同的数据,不会出现问题;
10  *      多个线程有读有些的访问某一个相同的数据,可能会出现问题;
11  *      因此,当线程访问共享数据的时候,必须添加一些措施来约束对共享数据的访问。另外,某个线程修改了共享数据,还需要通知其他线程数据发生了变化。
12  *
13  * 1.1 共享数据带来的问题
14  *      a. 条件竞争
15  *      b. 避免恶性条件竞争
16  *
17  *      条件竞争(race condition):多个线程争夺同一资源。对共享资源的修改是否具备"原子性"非常关键,如果具备,则不会出问题,否则就是梦魇的开始。
18  *      数据竞争:C++标准中定义了一种特殊的条件竞争:并发的去修改一个独立对象,数据竞争是(可怕的)未定义行为的起因。
19  *      原子性:一个操作在CPU上一次能执行完毕,则称之为原子性操作,原子性操作是安全的。而非原子性操作,常常会因为"操作系统时间切片"的缘故,操作被切断,资源被另一线程
20  * 抢夺,非原子性操作是不安全的。
21  *      条件竞争通常是时间敏感的,所以程序以调试模式运行时,它们常会完全消失,因为调试模式会影响程序的执行时间(即使影响不多)。
22  *
23  *      解决恶性条件竞争,最简单的办法就是对数据结构采用某种保护机制,确保当存在写数据的线程,只有当前修改共享数据的线程能处理数据的中间状态,
24  * 而其他线程只能等待,对其他线程而言,能够访问的共享数据状态,要么被修改还未开始,要么被修改已经结束。
25  *      C++标准库提供很多类似的机制,下面会逐一介绍:
26  *      第一种:对数据结构的设计进行修改,每个操作必须能完成一系列不可分割的变化,,这就是所谓的无锁编程。
27  *      第二种:使用事务的方式去处理数据结构的更新。类似于数据库事务的概念。  有一个相关的概念:"软件事务内存"(software transactional memory (STM))。
28  *
29  *      保护共享数据结构的最基本的方式,是使用C++标准库提供的互斥量。
30  *
31  *
32 */
33 int main(int argc, char *argv[])
34 {
35     QCoreApplication a(argc, argv);
36
37     return a.exec();
38 }

Original: https://www.cnblogs.com/azbane/p/15383014.html
Author: 我是张洪铭我是熊博士
Title: std::get<C++11多线程库~线程间共享数据>(09):共享数据带来的问题(1)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/536201/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C++实现的各种排序算法

    提起排序算法相信大家都不陌生,或许很多人已经把它们记得滚瓜烂熟,甚至随时可以写出来。最近在学习这一块, 索性就把各种内部排序算法总结归纳了一下: 1、 算法分类: 十种常见排序算法…

    C++ 2023年5月29日
    051
  • 关于C++ const 的全面总结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。 Const 是C++中常用的类型修饰…

    C++ 2023年5月29日
    047
  • A Complete Guide to Programming in C++ 笔记

    1.c++程序编译过程。包括两个阶段,compiler和linker。第一个阶段compiler是把c++文件编译成obj文件。第二个阶段是linker把多个obj文件和lib文件…

    C++ 2023年5月29日
    049
  • c++中CreateEvent函数

    函数原型: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL…

    C++ 2023年5月29日
    061
  • 【C++自绘控件】如何用GDI+来显示图片

    在我们制作一个应用软件的时候往往需要在窗口或控件中添加背景图。而图片不仅有BMP格式的,还有JPEG、PNG、TIFF、GIF等其它的格式。那么如何用jpg格式的图片来当背景呢? …

    C++ 2023年5月29日
    066
  • C++ STL std::copy 详解

    std::copy(start, end, std::back_inserter(container)); 这里,start和end是输入序列(假设有N个元素)的迭代器(itera…

    C++ 2023年5月29日
    070
  • 【面试攻略】C++面试-点点互动

    2020-11-23-点点互动 自我介绍 1.redis的数据结构和优化 https://blog.csdn.net/weixin_43631706/article/details…

    C++ 2023年5月29日
    058
  • C和C++混合编程中的extern “C” {}

    在用C++的项目源码中,经常会不可避免的会看到下面的代码: 它到底有什么用呢,你知道吗?而且这样的问题经常会出现在面试or笔试中。下面我就从以下几个方面来介绍它: 1、#ifdef…

    C++ 2023年5月29日
    060
  • Windows 8 添加隐私策略(C++版)

    well.新年上班第一天.不幸收到MS官方针对我们Snack Cards应用程序被打回消息.看看Report 内容如下: The app has declared access t…

    C++ 2023年5月29日
    062
  • C++STL之双端队列容器

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/huashanqingzhu/p/12832819.ht…

    C++ 2023年5月29日
    066
  • C++入门–友元、静态成员、单例设计模式、成员变量和函数的存储(三)

    posted @2021-12-15 17:06 sgggr 阅读(32 ) 评论() 编辑 Original: https://www.cnblogs.com/sggggr/p/…

    C++ 2023年5月29日
    062
  • 从C++到GO

    刚开始接触Go语言,看了两本Go语言的书,从c++开发者的角度来看看go语言的新特性,说下自己感触较深的几点: 并发编程 Go语言层面支持协程,将并发业务逻辑从异步转为同步,大幅提…

    C++ 2023年5月29日
    057
  • Fixed width integer types (since C++11)

    越界问题非常频繁地困扰着开发人员 CPP常用的类型定义不能体现数据的bit位数,让开发人员非常抓狂,相信很多人都遇到过,当判定一个数值是否越界时候,一定是先去网上查表, 但是数据类…

    C++ 2023年5月29日
    074
  • [C++] new和delete运算符使用方法

    new 和 delete 是C++语言中的两个运算符,配套使用。 new:用于分配内存,与C语言中的 malloc 相同,分配在堆内存 delete:用于释放内存,与C语言中的 f…

    C++ 2023年5月29日
    058
  • C++ 11 关键字:thread_local(转)

    thread_local 是 C++ 11 新引入的一种存储类型,它会影响变量的存储周期。 C++ 中有 4 种存储周期: 有且只有 thread_local 关键字修饰的变量具有…

    C++ 2023年5月29日
    047
  • vs code配置c/c++开发环境

    一,下载TDM-GCC https://jmeubank.github.io/tdm-gcc/ 二,下载免安装版本的 VSCode-win32-x64-1.58.2 三,配置(参考…

    C++ 2023年5月29日
    056
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球