
并发编程
文章平均质量分 55
软件工程小施同学
区块链、DevOps、小程序、软件工程
展开
-
TCMALLOC是什么 高并发内存中间件
高并发内存中间件(TCMALLOC)高并发内存中间件是一个在多线程并发条件下进行内存申请的程序。是谷歌公司TCMAlloc的学习致敬,再简化版本模拟实现。高并发内存中间件这个项目分为三个层次,这三个层次分别从上到下依次是ThreadCache、CentralCache、和PageCache。依靠三个层次的均衡调度来实现多线程下的内存申请与释放。高并发内存中间件是一个在多线程并发条件下进行内存申请的程序。是谷歌公司TCMAlloc的学习致敬,再简化版本模拟实现。转载 2022-10-23 21:26:41 · 278 阅读 · 0 评论 -
论文笔记All about Eve: Execute-Verify Replication for Multi-Core Servers
本文理解来自论文AllaboutEveEve是为了适应多核服务器而诞生的distributedreplication方案。Statemachinereplication旨在实现。由于让所有的replicas执行一样顺序的请求很困难,Eve采取的措施是消除所有replicas必须执行一样顺序的请求的限制,但这并不是说不对请求的并行执行做准备,否则就会达不到一致性。Eve采取的措施是将请求划分成一个一个batch,一个b。......转载 2022-07-31 17:03:00 · 199 阅读 · 0 评论 -
通过P-SMR看State Machine Replication
而在P-SMR中clientproxy中的C-G起到了调度官(scheduler)的作用,即由C-G来制定线程分配的调度策略,这种话就能指定某个命令分配到特定的线程上。而这在传统的linux内核调度上是做不到的,这也是P-SMR能做到并行运行的核心思想和方法所在。实际上我们忽略了一个问题,除了命令的运行能够并行化,怎样也让命令并行的传递(delivery),此时多个命令还是串行的在传递。2)假如4个命令之间是independent的,C-G对这4个命令的目的地的映射要达到最大的并行化的目的。......转载 2022-07-30 21:15:20 · 205 阅读 · 0 评论 -
tbb::atomic和std::atomic的区别 废弃
tbb::atomic已经被废弃,可以使用std::atomic替代https://www.intel.com/content/dam/develop/external/us/en/documents/tbbrevamp.pdftbb::atomicclass (as well as multiple obsolete and compatibility features) was deprecated in TBB 2019 U9 (for more information..原创 2021-12-22 10:30:59 · 775 阅读 · 0 评论 -
C++ std::condition_variable成员函数有哪些 notify_one()、notify_all()、wait()、wait_for()、wait_until()
原创 2021-12-14 16:43:21 · 1005 阅读 · 0 评论 -
C++ std::condition_variable 是什么 有什么用 条件变量 线程同步 wait wait_for notify_one notify_all
一、总述在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。主要成员函数如下:二、具体函数:1、wait函数:(1)wait(unique_lock <mutex>&lck)当前线程的执行会被阻塞,直到收到 notify 为止。(2)wait(unique_lock <mutex>&lck,Predicatepre..转载 2021-12-14 17:05:27 · 661 阅读 · 0 评论 -
tbb::parallel_for 实例
void testParallel_for() { // 一般普通的vector,无法保证线程安全,因此需要用tbb自带的 std::vector<int> vec{100, 200, 300, 400}; tbb::concurrent_vector<int> vec_tbb; vec_tbb.assign(vec.begin(), vec.end()); //初始化得到0,1,2,3, 最后一个默认参数是分割的粒度,一般默认是1 .原创 2021-12-14 11:47:27 · 1631 阅读 · 0 评论 -
冲突等价(ConflictEquivalence) 可串行化调度(Serializable Schedules)
事务事务(transaction)是在数据库上执行的一个或多个操作构成的序列,用来完成数据库系统的高级功能。SQL事务语句 事务启动(start):BEGIN; 事务提交(commit):COMMIT; 将事务对数据库的修改持久地写到数据库中 事务中止(abort):ROLLBACK; 将事务对数据库的修改全部撤销(undo),就像事务从未执行过 事务可以中止自己,也可以被DBMS中止 事务的ACID性质(TheACIDPropertie...转载 2021-11-11 21:33:41 · 9567 阅读 · 0 评论 -
C++ std::lock_guard 自动加锁、释放锁 原理
概述根据对象的析构函数自动调用的原理,c++11推出了std::lock_guard自动释放锁,其原理是:声明一个局部的lock_guard对象,在其构造函数中进行加锁,在其析构函数中进行解锁。最终的结果就是:在定义该局部对象的时候加锁(调用构造函数),出了该对象作用域的时候解锁(调用析构函数)。使用方法首先需要包含mutex头文件然后创建一个锁 std::mutex mutex在需要被加锁的作用域内 将mutex传入到创建的std::lock_guard局部对象中#include &转载 2021-10-13 21:15:07 · 2153 阅读 · 0 评论 -
调度问题 是什么
调 度 问 题 可 描 述 为 生 产 加 过 程 中 在满足 生 产 环 境 及 各类 约 束条件 下 将 问 题 中 的 所有 王 件 分 配 到 各 个机 器 上 进 行加 工 但 各 个 工 件要 根 据 既 定 规 则 进 行 排序 其 最 终 目 标 是 优 化 相 关指 定 的 性 能 指标...原创 2021-09-27 00:36:21 · 593 阅读 · 0 评论 -
线程同步是什么
线程同步就是保证使用共同资源的线程(定义它们是线程相关组)以串行方式执行各自的代码,一段时间内仅允许单个线程执行以消除多个线程对共享资源的并发访问冲突,即保证线程对共享资源执行的是原子操作。...原创 2021-09-26 10:13:15 · 526 阅读 · 0 评论 -
线程和进程区别
线 程(thread)就是指计算机正在执行的程序中的一个控制流 程,每个线程都有自己的资源(堆栈,计数器等)。与进程相 比,线程可以共享许多资源,如文件、内存等,另外,它比 进程更加容易控制,它涉及的资源管理更少,二者的本质区 别在于进程是完全独立的,而线程则不一定是独立的(同一 服务中的线程有可能互相影响)。...原创 2021-09-26 09:55:07 · 277 阅读 · 0 评论 -
脏写 脏读 不可重复读 幻读 读偏差 写偏差 丢失更新 示例
脏写(Dirty Write)脏读(Dirty Read)不可重复读(Non-Repeatable Read)幻读(Phantom)读偏差(Read Skew)写偏差(Write Skew)丢失更新(Lost Updates)从0到1理解数据库事务(上):并发问题与隔离级别 - 简书最近准备写一篇关于Spanner事务的分享,所以先分享一些基础知识,涉及ACID、隔离级别、MVCC、锁,由于太长,只好拆分成上下两篇: 上:并发问题与隔离级别主要讲事务所要...https://www.jian..原创 2021-09-23 20:49:06 · 367 阅读 · 0 评论 -
C++ tbb unsafe_erase() 并发访问 解决方案
加锁/*NOTICE:m_eraseMutex is used for eraseKey() method with tbb::concurrent_unordered_mapinstance only. Because in that eraseKey() method, we use unsafe_erase() method to delete elementin tbb::concurrent_unordered_map instance. As "unsafe_" pref原创 2021-09-22 19:25:56 · 713 阅读 · 1 评论 -
C++ TBB 文档手册地址
TBB ( Thread Building Blocks, 线程构建模块) 是Intel公司开发的并行编程开发的工具。它支持Windows,OS X, Linux平台,支持的编译器有Visual C++ (version 8.0 or higher, on Windows only), Intel C++ Compiler (version 11.1 or higher) or the GNU Compiler Collection (gcc).使用示例TBB 入门 - 一根稻草 简介 应用场景原创 2021-09-22 14:31:22 · 949 阅读 · 0 评论 -
MVCC(Multiversion concurrency control)
情景模拟:在高并发的前提下,一定要注意这个前提。事务L1修改某表中D的key值,还未提交;事务L2同样也修改D的key值,提交;然后L1提交。发生了什么?L1从D读取key:123对应的值100L2从D读取key:123对应的100L1对值增加1,将key:123更新为100 + 1L2对值增加2,将key:123更新为100 + 2如果L1和L2串行执行,key:123对应的值将为103,但上面并发执行中L1的执行效果完全被L2所覆盖,实际key:123所对应的值变成了102。就因为L.原创 2021-09-18 10:59:44 · 249 阅读 · 0 评论 -
Mysiam锁模式 innodb锁模式 是什么区别
Mysiam锁模式(表级锁)MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。a、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求.只有当读锁释放后才会执行其它进程的写操作。b、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。innodb锁模式(行级锁)意向.原创 2021-09-18 10:03:02 · 247 阅读 · 0 评论 -
共享锁 排他锁 是什么区别
共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。Mysql-各种锁区分与MVCC的详解-mysql教程-PHP中文网mysql的锁貌似有很多啊,查了大部分资料,什么表锁,行锁,页锁共享锁,排他锁,意向锁,读锁,写锁悲观锁,乐观锁。。我去,真想问一句,有没有 金锁?我还范冰冰呢。原创 2021-09-18 09:58:46 · 790 阅读 · 0 评论 -
表锁 行锁 页锁 是什么区别
表级锁(table-level locking):MyISAM和MEMORY存储引擎行级锁(row-level locking) :InnoDB存储引擎页面锁(page-level-locking):BDB存储引擎表级锁:开销小,并发低,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度也最低。行级锁:开销大,并发高,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。原创 2021-09-18 09:56:20 · 691 阅读 · 0 评论 -
活锁(live lock)是什么
活锁:是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。这样你让我,我让你,最后两个线程都无法使用资源。https://blog.youkuaiyun.com/qq_22054285/article/details/87911464https://blog.youkuaiyun.com/qq_22054285/article/details/87911464...原创 2021-09-13 17:13:14 · 1329 阅读 · 0 评论 -
阿姆达尔定律(Amdahl’s Law) 计算
阿姆达尔定律是一个计算机科学界的经验法则,因IBM公司计算机架构师吉恩·阿姆达尔而得名。吉恩·阿姆达尔在1967年发表的论文中提出了这个重要定律。它经常用于并行计算领域,用来预测适用多个处理器时理论上的最大加速比。在我们的性能调优领域,我们利用此定律有助于我们解决或者缓解性能瓶颈问题。在并行计算中,使用多个处理器的程序的加速比受限制于程序串行部分的执行时间。例如,如果一个程序使用一个CPU核执行需要20小时,其中部分代码只能串行,需要执行1个小时,其他19小时的代码执行可以并行,那么,不考虑转载 2021-09-09 14:44:56 · 2411 阅读 · 0 评论 -
C++ tbb::atomic<bool> 声明、读取load、重新赋值store
声明// 原子变量,isWarnedTimeout变量设置为false,保证线程安全tbb::atomic<bool> isWarnedTimeout(false);读取isWarnedTimeout.load()重新赋值isWarnedTimeout.store(true);原创 2021-08-26 14:36:17 · 1754 阅读 · 0 评论 -
C++ tbb::atomic
事情十这样的,有同事想要统计某些广告的点击,在多线程下运行,可能会同时操作同一个数据项,最早使用一个全局锁,效果不好,现在改成了细粒度锁,每一个数据项一个锁,但还是希望性能更好些。我的想法是,使用Intel TBB的Atomic,这就避免了使用锁,同时性能也会提升,不过,到底能提升多少还要用数据说话。1. 不使用锁的情况 #include <iostream> #include <vector> #include ...转载 2021-08-26 14:24:19 · 501 阅读 · 0 评论 -
写偏斜(Write Skew)和丢失更新(Lost Updates)区别
写偏斜(Write Skew)写偏斜可以理解为事务commit之前写前提被破坏,导致写入了违反业务一致性的数据,网上有个很好的简称为写前提困境,也就是读出某些数据,作为另一些写入的前提条件,但是在提交前,读入的数据就已被别的事务修改并提交,这个事务并不知道,然后commit了自己的另一些写入,写前提在commit前就被修改,导致写入结果违反业务一致性。写偏斜发生在写前提与写入目标不相同的情境下。这是业务开发中最容易出错地方,如果开发者不太理解隔离级别,也不知道目前使用的是哪个隔离级别,很可能写出原创 2021-08-18 09:59:12 · 3001 阅读 · 1 评论 -
数据库事务 写偏斜write-skew
快照隔离被称为事务隔离级别,它在性能和正确性之间提供了很好的组合,但是此处“正确性”的确切含义通常含糊不清。在这篇文章中,我想分解并准确记录何时发生“写偏斜”事件。事务快速入门数据库中的执行单位是事务。事务是工作的集合,这些工作要么全部完成,要么根本不运行。没有半成品事务。通常围绕事务提供许多保证,但是我们将重点放在隔离上。隔离使数据库的用户不必担心并发性,它决定了事务显示的程度,好像它在数据库中单独运行一样。各种可能的隔离级别的分类是一个有趣的话题,但是在这里,我们将只关注它们原创 2021-08-18 09:45:40 · 1167 阅读 · 0 评论 -
GO 计算所有并发任务的总时间 WaitGroup
开发过程中,经常遇到task之间的同步问题。例如,多个子task并发完成一部分任务,主task等待他们最后结束。在Go语言,实现同步的一种方式就是WaitGroup。 t1 := time.Now() var wg sync.WaitGroup for i := 0; i <= 10; i++ { wg.Add(1) go worker(t, client,1, &wg) } wg.Wait() t2 := time.Now() fmt.Print原创 2021-07-29 18:33:48 · 456 阅读 · 0 评论 -
Go 并发 多线程 goroutine channel 实例
Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。一、goruntinegoroutine 是轻量级线程,goroutine 的调度是由 Golang 运行时进行管理的。goroutine 语法格式:go 函数名( 参数列表 )例如:go f(x, y, z)开启一个新的 goroutine:f(x, y, z)Go 允许使用 go 语句开启一个新的运行期线程, 即 goroutine,以一个不同的、新创建的 goroutin原创 2021-07-29 15:52:19 · 2170 阅读 · 2 评论 -
TBB(Intel Threading Building Blocks)
并行与并发是相对的,OS里讲的是并发而在架构方面更多的是说并行。并行是分多个层面的,个人认为基本上可以分为这么几个层面:1、指令级的并行;即所谓的微程序、指令流水线等,现在cpu的一级缓存、二级缓存都很大,所以这个cache的效果还是比较好的(基于局部性原理)2、线程级的并行;即同一个时刻多个函数在运行(现在的cpu好像都是多核的)3、服务级别的(比如一个游戏服务器中有商店服务、也有战斗服务、聊天服务等 这里的每个服务可能对应多个逻辑线程)4、节点级别的;即所谓的分布式系统,多个节点互相配合,使转载 2021-07-21 20:57:44 · 5389 阅读 · 0 评论 -
java 多线程 异步调用
在Java平台,实现异步调用的角色有如下三个角色:调用者、 提货单 、真实数据,一个调用者在调用耗时操作,不能立即返回数据时,先返回一个提货单.然后在过一断时间后凭提货单来获取真正的数据.去蛋糕店买蛋糕,不需要等蛋糕做出来(假设现做要很长时间),只需要领个提货单就可以了(去干别的事情),等到蛋糕做好了,再拿提货单取蛋糕就可以了。package com.somnus.async; /** * * @Description: 顾客 * @author Somnus ..原创 2021-07-01 13:24:42 · 562 阅读 · 1 评论 -
第一类丢失更新和第二类丢失更新是什么 区别
第一类丢失更新 撤销一个事务的时候,把其它事务已提交的更新数据覆盖了。这是完全没有事务隔离级别造成的。如果事务1被提交,另一个事务被撤销,那么会连同事务1所做的更新也被撤销。 第二类丢失更新 它和不可重复读本质上是同一类并发问题,通常将它看成不可重复读的特例。当两个或多个事务查询相同的记录,然后各自基于查询的结果更新记录时会造成第二类丢失更新问题。每个事务不知道其它事务的存在,最后一个事务对记录所做的更改将覆盖其它事务之前对该记录所做的更改。 作者:西安法律咨询服务平台与程序员 链接:h原创 2021-06-15 21:25:39 · 2181 阅读 · 0 评论 -
并发 不同的隔离等级存在的问题
无事务隔离级别,则存在:第一类丢失更新、脏读、不可重复读、第二类丢失更新和幻读问题。Read Uncommitted存在:脏读、不可重复读、第二类丢失更新和幻读问题。Read committed存在:不可重复读、第二类丢失更新和幻读问题。Repeatable Read存在:幻读问题。Serializable 不存在问题。作者:西安法律咨询服务平台与程序员链接:https://www.jianshu.com/p/592b2cdbc589...原创 2021-06-15 21:18:14 · 352 阅读 · 0 评论