В начале все читатели приходят,
Под "входом" я понимаю, что вы выполняете вызовы printf()
в цикле readerJob
.Неудивительно, что все читатели приходят первыми, потому что вы запускаете их первыми, и в вероятном случае, когда первый поток читателей, пытающийся заблокировать tryResourceMutex
, делает это раньше, чем любой поток записывающего устройства, он затем блокирует resourceMutex()
,также, предотвращая "вход" любого автора. Но то, что не не мешает авторам увеличивать NO_WRITERS_WRITING
. И это также не мешает одному из них заблокировать tryResourceMutex
и удерживать его заблокированным.
sleep()
вызов в читателе будет (вероятно) заставлять resourceMutex
удерживаться непрерывно достаточно долго, чтобы все читатели приходили раньше, чем кто-либо из авторов, так как каждый писатель должен получить resourceMutex
, чтобы войти.
затем также писатели, которые не должны быть возможны в то же время.
Я не вижу этого в моих тестах.Но я делаю вижу то, что я уже описал: счетчик писателей увеличивается с нуля, даже если им запрещено входить, когда внутри читатели.По сути, имя вашей переменной NO_WRITERS_WRITING
не соответствует вашему фактическому использованию - указывает, сколько писателей пишут или ожидают записи .
Когда читатели уходят, они блокируются отвозвращаясь сразу же, потому что один из авторов держит tryResourceMutex
.В конце концов, последний читатель выйдет и выпустит resourceMutex
.Это позволит авторам продолжать работу по одному, но с вызовом sleep()
, расположенным там, где он находится в цикле записи, крайне маловероятно, что число авторов когда-либо упадет до нуля, чтобы любой из читателей могповторный ввод.Однако если это произойдет, то, скорее всего, тот же цикл повторится: все читатели будут входить один раз, а все писатели стоят в очереди.
Тогда все читатели исчезнут, но их большеодин писатель одновременно в библиотеке.
Опять нет.Только один писатель находится внутри, но остальные большую часть времени стоят в очереди, так что NO_WRITERS_WRITING
почти всегда будет равно NO_WRITERS
.
Суть в том, что вы запутались.Вы используете переменную NO_WRITERS_WRITING
главным образом для представления числа писателей, которые готовы к записи, но ваша система обмена сообщениями использует ее так, как если бы это было число, которое фактически пишет.То же самое не относится к NO_READERS_READING
, потому что как только поток получает мьютекс, необходимый для изменения этой переменной, ничто иное не мешает ему войти в комнату.
Еще одна вещь: сделать симуляцию интересной -т. е. чтобы не дать авторам возможности получить постоянный контроль - вы должны ввести задержку, желательно случайную, после того, как каждый поток покидает комнату, прежде чем он попытается повторно войти.И задержка для писателей, вероятно, должна быть значительно больше, чем задержка для читателей.