主要内容:

  • 并发数据结构设计的意义
  • 指导如何设计
  • 实现为并发设计的数据结构

  如果一种数据结构可以被多个线程所访问,其要不就是绝对不变的(其值不会发生变化,
并且不需同步),要不程序就要对数据结构进行正确的设计,以确保其能在多线程环境下能够
(正确的)同步。一种选择是使用独立的互斥量,其可以锁住需要保护的数据,另一种选择是设计一种能够并发访问的数据结构。第一种使用互斥量,在同一时间只有一个线程可以访问数据,实际是一种串行的序列化访问。显示的组织了多线程对数据结构的并发访问。

所以,缩小保护区域,减少序列化访问,就能提高并发。允许线程并发读取的数据结构并不少见,而对数据结构的修改,必须是单线程独立访问。所以不可能完全实现并发,只能让序列化访问最小化。

一、基于锁的并发数据结构

基于锁的并发数据结构设计,需要确保访问线程持有锁的时间最短。都是在保证数据结构是线程安全的前提下。在设计数据结构,考虑以下问题:

  • 锁的范围中的操作,是否允许在所外执行?
  • 数据结构中不同的区域是否能被不同的互斥量所保护?
  • 所有操作都需要同级互斥量保护吗?
  • 能否对数据结构进行简单的修改,以增加并发访问的概率,且不影响操作语义?

1、使用锁实现一个线程安全的栈

 1 #include <exception>
 2 struct empty_stack: std::exception
 3 {
 4   const char* what() const throw();
 5 }; 6 template<typename T>
 7 class threadsafe_stack
 8 {
 9 private:
10   std::stack<T> data;
11   mutable std::mutex m;
12 public:
13   threadsafe_stack(){}
14   threadsafe_stack(const threadsafe_stack& other)
15   {
16     std::lock_guard<std::mutex> lock(other.m);
17     data=other.data;
18   }
19   threadsafe_stack& operator=(const threadsafe_stack&) = delete;
20   void push(T new_value)
21   {
22     std::lock_guard<std::mutex> lock(m);
23     data.push(std::move(new_value)); // 1
24   }
25   std::shared_ptr<T> pop()
26   {
27      std::lock_guard<std::mutex> lock(m);
28     if(data.empty()) throw empty_stack(); // 2
29     std::shared_ptr<T> const res(
30       std::make_shared<T>(std::move(data.top()))); // 3
31     data.pop(); // 4
32     return res;
33   }
34   void pop(T& value)
35   {
36     std::lock_guard<std::mutex> lock(m);
37     if(data.empty()) throw empty_stack();
38     value=std::move(data.top()); // 5
39     data.pop(); // 6
40   }
41   bool empty() const
42   {
43     std::lock_guard<std::mutex> lock(m);
44     return data.empty();
45   }
46 };

线程安全队列——使用锁和条件变量

线程安全队列——使用细粒度锁和条件变量

(参考《并发编程》,先占坑以后补上没有实战经验看不太懂)

二、使用锁设计更加复杂的数据结构

编写一个使用锁的线程安全查询表

编写一个使用锁的线程安全链表

转载于:https://www.cnblogs.com/huangfuyuan/p/9131666.html

并发编程(6)基于锁的并发数据结构设计相关推荐

  1. qt 5编程入门(第2版)_《C++并发编程实战第2版》第六章:设计基于锁的并发数据结构(1/3)...

    本章主要内容 设计并发数据结构的含义 设计指南 并发数据结构的示例实现 在上一章中我们了解了底层原子操作和内存模型.本章我们先把底层的细节放一放(尽管在第7章我们将需要它们),探讨一下数据结构. 为编 ...

  2. 第6章 基于锁的并发数据结构设计

    第6章 基于锁的并发数据结构设计 本章主要内容 ※并发数据结构设计的意义 指导如何设计 ※实现为并发设计的数据结构 在上一章中,我们对底层原子操作和内存模型有了详尽的了解.在本章中,我们将先将底层 的 ...

  3. 并发编程中的锁、条件变量和信号量

    在并发编程中,经常会涉及到锁.条件变量和信号量.本文从并发开始,探究为什么需要它们,它们的概念,实现原理以及应用. 并发简介 并发是指多个事情,在同一时间段内同时发生了.和并发经常一起被提到的是并行. ...

  4. 学习笔记:Java 并发编程④_无锁

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  5. C++线程编程-设计无锁的并发数据结构

    定义和结果 使用互斥元.条件变量以及future 来同步数据的算法和数据结构被称为阻塞的算法和数据结构.调用库函数的应用会中断一个线程的执行,直到另一个线程执行一个动作.这种库函数调用被称为阻塞调用, ...

  6. 实战并发编程 - 04基于不可变模式解决并发问题_2

    文章目录 Pre 业务描述 短信服务商基本信息 短信路由网关 基于不可变模式改造代码 第一步先将SmsInfo改造为不可变对象 接着在需要将获取服务商列表的代码改造为防御性复制 接着提供一个直接替换S ...

  7. 并发编程之深入理解JMM并发三大特性volatile

    并发编程之深入理解JMM&并发三大特性&volatile 并发和并行 并发三大特性 可见性 有序性 原子性 Java内存模型(JMM) JMM定义 JMM与硬件内存架构的关系 内存交互 ...

  8. 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...

    不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...

  9. Java并发编程的艺术,解读并发编程的优缺点

    并发编程的优缺点 使用并发的原因 多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升. 在特殊的业务场景下先天的就适合于并发编程. 比如在 ...

  10. java 并发框架源码_Java并发编程高阶技术-高性能并发框架源码解析与实战

    Java并发编程高阶技术-高性能并发框架源码解析与实战 1 _0 Z' @+ l: s3 f6 r% t|____资料3 Z9 P- I2 x8 T6 ^ |____coding-275-master ...

最新文章

  1. Linux硬盘安装_ubuntu
  2. asp+MsSQL2000模拟Html静态文件缓存
  3. Amazon Go亮相:消费者无需结账即可完成店面购物
  4. r语言x%3c-读取文件,R语言读写最灵活的文件——txt文件
  5. 庖丁解牛TLD(三)——算法初始化
  6. SQL Cookbook:二、查询结果排序(1)以指定的次序返回查询结果
  7. 易安卓 html5,Developing a Multi Platforms Web Applications for Mobile Device Using HTML5
  8. linux date输出到文件,Linux常用命令--ls、cd、date用法
  9. C/C++获取高精度时间
  10. python集合补集、差集、并集_python set集合运算(交集,并集,差集,对称差集)...
  11. Windows xp下IDT Hook和GDT的学习
  12. web网络图片查看器Android
  13. TV Metro界面(仿泰捷视频TV版)源码解析
  14. web.xml中配置启动时加载的servlet,load-on-starup
  15. UNI-APP实现扫描二维码
  16. 英语学习逆向法 (钟道隆 著)
  17. 读书寄语:这一年,谢谢自己
  18. 设计图标(logo)
  19. Primefaces使用小结
  20. VMware Workstation虚拟机设置联网(Linux)

热门文章

  1. Base64压缩UUID长度替换Hibernate原有UUID生成器
  2. 【转】adns解析库——域名解析实例(C++、linux)
  3. MEncoder的基础用法—6.6. 改变电影大小
  4. Intent 与 IntentFilter 详解
  5. 手机端判断触摸滑动方向
  6. 三万字详解SpringClould高可用流量防护组件Sentinel哨兵(含源码例子)
  7. 截图软件 snipaste
  8. 中学办公室计算机管理制度,中学多媒体室使用管理制度条例
  9. 三个箭头循环标志_摩托车6年免检,应该如何通过APP申请免检检验标志?
  10. php课后答案 唐四薪_php课后习题及答案