Russian Qt Forum

Qt => Общие вопросы => Тема начата: admsasha от Август 08, 2013, 13:50



Название: непонятки с QReadWriteLock
Отправлено: admsasha от Август 08, 2013, 13:50
Разбираюсь с QReadWriteLock немного не понимаю, как он поступает с unload, если я заблокировал только для чтения.

Например 10 потоков сделали блокировку (lockForRead), когда один из них выполнил unlock() что происходит ?

Если один поток в режиме чтения блокирует в течении часа, потом подошел другой поток, который хочет заблокировать в режим записи, через секунду приходит третий поток, который хочет блокировать только для чтения. Третий поток будет ждать когда второй поток выполнит свою задачу или встрянет вне очереди ?


Название: Re: непонятки с QReadWriteLock
Отправлено: Fregloin от Август 08, 2013, 14:07
Суть потока в том, что бы один мог писать, многие могли читать. Однако по сути тут могут многие и писать и читать одновременно.
По этому, если блокировка блокируется на чтение (т.е. будет производиться запись), то все потоки, которые захотят считать ресурс заблокируются. При освобождении блокировки, разблокируются потоки которые висят на чтении, а вот порядок их не регламентирован. Может я и ошибаюсь, но суть должна быть понятна.


Название: Re: непонятки с QReadWriteLock
Отправлено: admsasha от Август 08, 2013, 14:14
т.е. два в цикле потока которые выполняются час (блокировка для записи), с разностью запуска в 30 минут, никогда не позволят третьему потоку сделать блокировку на чтение ?



Название: Re: непонятки с QReadWriteLock
Отправлено: Igors от Август 08, 2013, 15:06
Нельзя писать пока хоть один читает. Но запрос чтения будет ждать если есть запрос на запись. Пример

Интервал 13:00 - 14:00 (нитки 1, 2, 3 читают)
13:01 - нитка 4 хочет писать, будет ждать до 14:00 пока не останется ни одного читающего
13:30 - нитка 5 хочет читать. Будет ждать пока нитка 4 захватит запись (в 14:00) и более пока запись не завершена и нитка 4 не освободит лок. Если в течение этого времени будут еще запросы на запись - пока все писатели не отстреляются