码迷,mamicode.com
首页 > 编程语言 > 详细

多线程锁

时间:2019-11-12 20:02:33      阅读:74      评论:0      收藏:0      [点我收藏+]

标签:多线程   特性   析构   ble   variable   条件判断   获得   逻辑   没有   

  cpp11里用于并发的工具有主要有thread、mutex、condition_variable,其中condition_variable条件变量wait可以附加条件,是对条件和锁的封装,如果不加条件只用锁就是一元信号量,只有一元的pv操作,而附加了条件后若条件为真则直接后续,非真则等待(阻塞并归还锁),所以可以利用其中的条件判断来构建需要的逻辑。unique_mutex是对mutex增加RAII的特性,获取既初始化(获得锁),离开作用域自动析构,自动解锁。

  生产者-消费者问题:仓库未满生产者可以生产,仓库非空消费者可以消费。生产者消费者对于仓库的增加减少需要互斥,粗糙一点直接让两者行动互斥,未满是生产的前提需要一个条件变量,非空是消费的前提需要另一个条件变量。(一家人吃水果问题):父亲放苹果,女儿吃苹果,母亲放橘子,儿子吃橘子,盘子里只用一个水果。首先让所有人的行动互斥,同一时间只有一个人可以有行为。子女能行动的前提是要有对应的水果,所以需要两个条件变量,而父母行动的前提是盘子为空,所以还需要一个条件变量。

  读者-写者问题:为保证数据一致,同一时间只有一个写者可以写,但读者可以多个同时读。写者只能独立运行需要让所有人加锁,而读者可以拿完锁后释放,写者还要保证前面没有读者,所以要加一个条件变量,比如一个计数变量来判断,并且把这个计数变量的修改加入写者之前拿到的锁里,保证一致。读者退出时再加锁,修改计数后解锁。但这种情况下只要有一个读者进入,后续读者可以不断进入导致写者“饥饿”,所以增加一个条件,排在写者后续的读者不再进入,先等待写者写完,所以要在读者里加一个条件变量,判断没有写者等待。这些读者由写者执行完来唤醒。但又有一个新的问题,如果此时写者有多个时,写者后又排了写者,后面还排了读者,则在写者写完会唤醒后面的读者而不是后面的写者,后面的写者需要等读者读完才被唤醒,如何让队列按顺序执行又是一个新的问题。

  哲学家进餐问题:

多线程锁

标签:多线程   特性   析构   ble   variable   条件判断   获得   逻辑   没有   

原文地址:https://www.cnblogs.com/lector/p/11834826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!