6.4-chinese
发表于|更新于|C++
|总字数:196|阅读时长:1分钟|浏览量:
6.4 本章总结
本章开篇,我们讨论了设计并发数据结构的意义,以及给出了一些指导意见。然后,通过设计一些通用的数据结构(栈,队列,哈希表和单链表),探究了在指导意见在实现这些数据结构的应用,并使用锁来保护数据和避免数据竞争。那么现在,你应该回看一下本章实现的那些数据结构,再回顾一下如何增加并发访问的几率,和哪里会存在潜在条件竞争。
在第7章中,我们将看一下如何避免锁完全锁定,使用底层原子操作来提供必要访问顺序约束,并给出一些指导意见。
文章作者: Estom
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Estom的博客!
相关推荐

2025-02-21
13 读写锁问题
读写锁问题读的时候共享、写的时候独占。 方案一:ReentrantReadWriteLock(推荐方案)核心特性: 读锁共享:允许多线程并发读取写锁独占:写操作时完全互斥135锁降级:写线程可降级为读锁,保证数据一致性 12345678910111213141516171819202122232425import java.util.concurrent.locks.*;public class ReadWriteResource { private int value; private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); private final Lock readLock = rwLock.readLock(); private final Lock writeLock = rwLock.writeLock(); // 读操作(共享) public int readValue() { readLock.lo...

2021-03-05
3 迭代器
迭代器1 基础头文件1#include<iterator> 迭代器范围 begin和end被容器使用了,可以用front和back作为游标。左闭右开区间 1[begin,end) 使用迭代器进行遍历 遍历方法有三种:下标遍历、范围for遍历、迭代器遍历 1234567container c;first = c.begin();last = c.end();while(first != last){ cout<<*first<<endl;//指向元素的游标指针。 ++begin;} 迭代器的类型 正常迭代器 12begin()end() 反向迭代器 12rbegin()rend() 常量迭代器 12cbegin()cend() 操作冲突容器操作可能会使迭代器实效。 2 迭代器类型——迭代器的适配器除了容器定义的迭代器之外,标准库头文件iterator总额外定义了几种迭代器。 插入迭代器。绑定到一个容器上,用来向容器中国插入元素 流迭代器。绑定到输入输出流上,用来遍历关联的IO流 反向迭代器。反...

2021-09-02
17-并发编程
基于原文 Go语言基础之并发 和 视频 93-111 整理。 17 Go语言中的并发编程并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。 17.1 并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天,一个主体同一时间做多个任务)。 并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天,多个主体同一时间做多个任务)。 Go 语言的并发通过 goroutine 实现。goroutine 类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个 goroutine 并发工作。goroutine 是由 Go 语言的运行时(runtime)调度完成,而线程是由操作系统调度完成。 Go 语言还提供 channel 在多个 goroutine 间进行通信。 goroutine 和 channel 是 Go 语言秉承的 CSP(Communicating Sequential Process)并发模式的重要实现基础。 17.2 goroutine在 java/c++ 中我们要实现并发编程的时候...

2021-09-07
6.0-chinese
第6章 基于锁的并发数据结构设计本章主要内容 并发数据结构设计的意义 指导如何设计 实现为并发设计的数据结构 在上一章中,我们对底层原子操作和内存模型有了详尽的了解。在本章中,我们将先将底层的东西放在一边(将会在第7章再次提及),来对数据结构做一些讨论。 数据结构的选择,对于程序来说,是其解决方案的重要组成部分,当然,并行程序也不例外。如果一种数据结构可以被多个线程所访问,其要不就是绝对不变的(其值不会发生变化,并且不需同步),要不程序就要对数据结构进行正确的设计,以确保其能在多线程环境下能够(正确的)同步。一种选择是使用独立的互斥量,其可以锁住需要保护的数据(这种方法已经在第3和第4章中提到),另一种选择是设计一种能够并发访问的数据结构。 在设计并发数据结构时,你可以使用基本多线程应用中的构建块(之前章节中有提及),比如,互斥量和条件变量。当然,你也已经在之前的章节的例子中看到,怎样联合不同的构建块,对数据结构进行写入,并且保证这些构建块都是在并发环境下是线程安全的。 在本章,我们将了解一些并发数据结构设计的基本准则。然后,我们将再次重温锁和条件变量的基本构建块。最后,会去...

2021-09-01
附录4 MySQL事务管理
MySQL事务管理 参考文献 Mysql并发控制 本章主要讲了MySQL的事务管理,即MySQL的并发控制,MySQL在并发过程中如何进行同步,即MySQL保证事物的原子性、隔离性、一致性、持久性的方法。也属于并发机制的一部分。 4 多级锁协议封锁粒度MySQL 各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。 表级锁定(table-level)表级别的锁定是 MySQL 各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并发度大打折扣。使用表级锁定的主要是 MyISAM,MEMORY,CSV等一些非事务性存储引擎。 行级锁定(row-level)行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并...

2021-04-11
7 处理继承关系
7 处理继承关系1 Pull Up Field(字段上移)如果两个子类有相同的字段,则将该字段上移至超类中。 2 Pull Up Method(函数上移)如果两个子类有相同的函数而且产生完全相同的结果,则将该函数上移至超类。 3 Extract Superclass(提炼超类)如果两个类有相似特性,可以为这两个类建立一个超类,将相同特性移至超类。如果继承不合适,可以使用[Extract Class](#Extract Class)来提取重复代码。 4 Form Template Method(塑造模板函数)该重构的手法其实就是设计模式中的模板模式,如果有一些子类,其中对应的某些函数以相同顺序执行类似的操作,但在各个操作的细节上有所不同。可以将这些操作分别放到独立的函数中,替换在原函数中原有的操作代码,并上移至超类。 重构示例2212345678910111213141516171819202122232425262728// 重构前class Site {public: virtual double GetBillableAmount() = 0; /...
公告
欢迎参观Estom的小屋




