Я пытаюсь реализовать решение для читателей-писателей на С++ с помощью std::thread.
Я создаю несколько потоков чтения, которые работают в бесконечном цикле, делая паузу на некоторое время между каждым доступом для чтения. Я попытался воссоздать алгоритм, представленный в книге Таненбаума об операционных системах:
rc_mtx.lock(); // lock for incrementing readcount
read_count += 1;
if (read_count == 1) // if this is the first reader
db_mtx.lock(); // then make a lock on the database
rc_mtx.unlock();
cell_value = data_base[cell_number]; // read data from database
rc_mtx.lock();
read_count -= 1; // when finished 'sign this reader off'
if (read_count == 0) // if this was the last one
db_mtx.unlock(); // release the lock on the database mutex
rc_mtx.unlock();
Конечно, проблема в том, что поток, который может удовлетворять условию быть последним читателем (и, следовательно, хочет выполнить разблокировку), никогда не получал db_mtx
. Я попытался открыть еще один «материнский» поток, чтобы читатели могли позаботиться о получении и освобождении мьютекса, но во время этого процесса я теряюсь. Если есть элегантный способ решить эту проблему (поток может попытаться освободить мьютекс, который никогда не был получен) элегантным способом, я был бы рад услышать!
read_count
какstd::atomic
, что заблокирует автора, если только это не0
- person kmdreko   schedule 07.06.2016db_mtx
, и с какой стати вы перебираете два (!) мьютекса, чтобы загрузить одно значение, которое никогда не используете? - person Useless   schedule 07.06.2016