多线程锁

Posted lector

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程锁相关的知识,希望对你有一定的参考价值。

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

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

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

  哲学家进餐问题:

以上是关于多线程锁的主要内容,如果未能解决你的问题,请参考以下文章

synchronized锁多线程同步的原理是咋样的?

无锁多线程编程初步(基础部分)

并发编程之多线程

《C++多线程编程》学习笔记

多线程加锁#yyds干货盘点#

iOS - 多线程的锁