读者写者问题浅析(代码实现)

来源:互联网 发布:编程原本 pdf 下载 编辑:程序博客网 时间:2024/04/30 23:18
读者作家(RW)或共享独占锁(也称为多个读取器/单写入器锁定或多读卡器锁)的一个同步原语,解决了一个读者-writers问题。一个RW锁允许并发的只读操作的访问,而写操作需要独占访问。这意味着多个线程可以并行读出的数据,但独占锁是需要编写或修改数据。当一个作家写数据,直到作家写完所有其他作家或读者将被阻止。一个常见的用途可能是用于控制访问存储器中的数据结构不能被更新原子和是无效的(不应该由另一个线程被读取),直到完成更新。
读者作家锁通常建在上面互斥和条件变量,或在顶部信号量。

优先级策略
RW锁可设计为读者与作家访问不同的优先政策。锁可以被设计成总是给读者(优先读喜欢),总是优先考虑的作家(写喜欢),或者是不确定的问候优先。这些政策导致的问候不同的权衡并发和饥饿。
读优先RW锁允许最大的并发,但可能会导致如果争高写饥饿。这是因为写线程将不能只要至少有一个读线程持有它来获取锁。由于多个读线程可以举行一次锁定,这意味着一个作家线程可能会继续等待锁,而新读者线程能够获取锁,甚至到了作家可毕竟还是读者的等待点其分别持有的锁时,它首先试图获取它已经发布了锁。优先读者可能疲软,因为刚才所描述的,或强,这意味着只要一个作家释放锁,任何阻塞的读者总是得到它旁边。
写优先RW锁,防止任何避免写入器资源匮乏的问题,新的读者从获取锁,如果有一个作家排队,等待锁; 作为已经持有该锁的所有读者已经完成了作家会尽快获取该锁。缺点是,宁愿写锁允许在写线程的情况下少并发,相比读宁愿RW锁。另外,锁是少高性能,因为每个操作,取或释放锁读或写,比较复杂,需要内部采集和发行了两张互斥体而不是一个。这种变化有时也被称为“直写偏见“的读者,作家锁。

未指定优先RW锁不提供任何担保与读与写访问的问候。未指定优先级可以在某些情况下是可取的,如果它允许更有效的实现。


接下来,我们便自己实现一个简单的读者-writers问题

首先,我们来看一个新的函数:



代码如下:




那么结果呢?



替代品
读-复制-更新(RCU)算法是一种解决方案给读者编写者问题。RCU是无等待读者。在Linux内核中实现了所谓的少数作家一个特殊的解决方案顺序锁。
0 0