标签:多线程 特性 析构 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