使用计数器

时间:2015-11-28 21:01:49

标签: semaphore

这样的问题。我想了解如何使用信号量。为了练习,我采取了读者/作家的经典问题 使用循环内存缓冲区。我想只讨论作家。如果我用大于1的计数初始化信号量, 我看到我的作家可以写到同一个内存位置。那么信号量与计数器的含义是什么呢? 不保证对共享资源的同步访问?看来我应该为每个存储单元提供单独的信号量。

2 个答案:

答案 0 :(得分:1)

当信号量初始化为1并且行为类似于互斥锁时,您的用例是一种特殊情况。显然,输入2将是一个错误,因为它不再是一个正确的锁。

尽管如此,信号量在许多其他情况下使用,例如,假设您要确保一次运行的线程数不超过5个。

您可以在5处设置信号量,每次生成线程时都会对其进行操作,每次线程结束时,您都会执行此操作。

尝试生成第6个帖子会导致你被卡住了#39;在down()中,直到一个线程最终完成,执行up()将解锁你。

答案 1 :(得分:0)

Semaphore

信号量是一种在多个线程之间共享资源的方法。在Readers-writers problem中,它是一种保证数据一致性的方法,通过在读取数据时防止更新,并防止在写入数据时进行读取。它只允许一个编写器和多个并发读取器。

谈论信号量只有在有读者和作者的情况下才有用;在独占锁的情况下,只有一个“拥有”锁的线程(可以访问资源),它们通常被称为Mutex(互斥的简称)。

实施

我以相反的方式实现了信号量(由于CPU specifics):正数表示有多少读者,负数表示有一位作者。

最初信号量为0,表示没有作者,没有读者。

读取锁定

只要读者想要阅读,信号量必须为0或正数,以支持并发读取。如果是这样,则递增。然后是正数,表明有读者。
读者会做一个成功的LOCK_READ,除非信号量是负数,表明它正在被写入并因此不一致。如果发生这种情况,执行读锁定的线程将暂停,直到信号量变为0(或更高)。

写锁定

编写者想要写入的任何时候,信号量必须为0,因为如果它是肯定的,读者可能会获得部分更新(损坏)数据,如果是负数,则它已经被另一个线程写入锁定。如果信号量指示未访问资源(0),则信号量将递减。

<强>解锁

解锁与锁定相反,除了不需要暂停线程来解锁资源。通过递减信号量来解除读锁定,并通过递增信号量来解除写锁定。