Я узнаю о потоках 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) и блокировкой (mutex) в вышеупомянутом псевдокоде? Если однажды мы назовем блокировку, программа должна заблокировать ее независимо от того, какой параметр мы передаем правильно? Итак, что здесь означают следующие параметры: rw_mutex и mutex? Как работает множественная блокировка мьютексов?