多个互斥锁如何工作?

时间:2016-05-02 02:33:19

标签: c linux multithreading pthreads mutex

我正在学习POSIX线程,我的教授已经开始讲授第一个读者 - 作家问题。这是我解决问题的伪代码(仅适用于第一种情况:读者的偏好)。

semaphore rw_mutex = 1; /* semaphore common to both reader & writer */
semaphore mutex = 1; /* semaphore for reading (reader lock) */
int read_count = 0; /* track number of readers in CS */


Writer:
do {
lock(rw_mutex);
/* ensure no writer or reader can enter */
...
/* writing is performed */
...
unlock(rw_mutex);
/* release lock */
} while (true);


Reader:
do
{
lock(mutex);
/* first update read_count atomically */
read_count++;
if (read_count == 1) {
lock(rw_mutex);
/* ensure no writer can enter */
}
unlock(mutex);
/* allow other readers to access */
...
/* reading is performed */
...
lock(mutex);
read_count--;if (read_count == 0) unlock(rw_mutex);
/* allow writers after
last reader has left the CS */
unlock(mutex);
/* release lock */
} while(true);

首先,这是我对互斥锁的理解:一旦我们创建了一个锁和解锁对,这两个实体之间的代码一次只能被一个线程访问。

现在,如果我的理解是正确的,那么我几乎可以理解上述伪代码的Writer部分中发生了什么。我们锁定然后写入共享资源,同时,没有人可以访问共享资源,因为它被锁定,然后我们只是解锁它。

但我在理解读者部分时遇到了问题。如果我们锁定一次,这意味着它会被锁定,直到我们再次解锁它为止?在这种情况下,在读者的章节中使用两次锁定是什么?

我的主要问题是: 锁定是什么意思?以及上述伪代码中的lock(rw_mutex)和lock(mutex)之间的区别是什么?如果我们调用一个锁,程序应该锁定它,无论我们传入的参数是什么?那么这些参数是什么:rw_mutex和mutex在这里意味着什么?多个互斥锁定如何工作?

1 个答案:

答案 0 :(得分:3)

考虑互斥锁的方法是这样的:互斥体就像一个令牌,在任何时间点都可以由一个线程持有,或者可供任何线程使用。

当一个线程在互斥锁上调用lock()时,它正在尝试使用互斥锁:如果互斥锁可用(“解锁”),则它会立即将其取出,否则如果它当前由另一个持有线程(“锁定”)然后它会等到它可用。

当一个线程在互斥锁上调用unlock()时,它返回一个当前持有的互斥锁,以便它可供另一个线程使用。

如果您有多个互斥锁,则每个互斥锁都是独立的:一个线程既不能同时拥有一个,也不能同时包含这两个互斥锁。

Reader中,线程首先获得mutex。虽然mutex归线程所有,但没有其他线程可以获取mutex,因此{em} lock(mutex); / {{1}之间不能执行任何其他线程对(一个在unlock(mutex);函数的顶部,另一个在向下)。因为Reader只能在这样的一对中访问(而read_count被保留),我们知道一次只能有一个线程访问mutex

如果read_count刚刚从{0}增加Reader,它还将获得read_count互斥锁。这可以防止任何其他线程获取那个互斥锁,直到它被释放为止,这会阻止rw_mutex进入其关键部分。

当该线程离开临界区时,此代码有效地将Writer的所有权从rw_mutex中锁定它的线程传递给临界区中的任何剩余读者。这只是代码逻辑的问题 - 不需要实际调用(这是唯一可能的,因为它使用信号量来实现Reader,而不是例如pthreads互斥锁,它必须由锁定它的线程。)

相关问题