使用带计数器的信号量



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

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

然而,在许多其他情况下使用的信号量a,例如,表示您希望确保一次运行的线程不超过5个。

您可以将信号量设置为5,每次生成线程时,您都会对其执行向下操作,每次线程完成时,您也会执行向上操作。

尝试派生第6个线程会导致您被"卡住"在down()中,直到某个线程最终完成执行一个up()来解锁您。

信号量

信号量是在多个线程之间共享资源的一种方式。在读写器问题中,它是一种确保数据一致性的方法,在读取数据时防止更新,在写入数据时防止读取。它只允许一个写器和多个并发读写器。

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

实施

我以另一种方式实现了信号量(由于CPU的特殊性):正数表示有多少读卡器,负数表示有一个编写器。

最初信号量为0,表示没有写入程序,也没有读取器。

读取锁定

任何时候读卡器想要读取,信号量必须为0或正,以支持并发读取。如果是这样,它将递增。那么,正数表示有读者
读取器将执行LOCK_READ,这将成功,除非信号量为负,表明它正在被写入,因此不一致。如果发生这种情况,执行读取锁定的线程将被挂起,直到信号量变为0(或更高)。

写入锁定

每当编写器想要写入时,信号量都必须为0,因为如果为正,则读取器可能会获得部分更新(损坏)的数据,如果为负,则已被另一个线程锁定以进行写入。如果信号量指示资源未被访问(0),则信号量递减。

解锁

解锁与锁定相反,只是不需要挂起线程来解锁资源。读锁是通过减少信号量来解除的,写锁是通过增加信号量来取消的。

最新更新