![]() |
PIP 5.6.1
Platform-Independent Primitives
|
Примитив синхронизации, допускающий одновременных читателей и эксклюзивный доступ писателя. Подробнее...
#include <pireadwritelock.h>
Открытые члены | |
| PIReadWriteLock | PIReadWriteLock () |
| Создает PIReadWriteLock. | |
| ~PIReadWriteLock () | |
| Деструктор PIReadWriteLock. | |
| void | lockWrite () |
| Захватывает доступ на запись, ожидая отсутствия активных читателей и писателя. | |
| bool | tryLockWrite () |
| Пытается захватить доступ на запись без ожидания. | |
| bool | tryLockWrite (PISystemTime timeout) |
| Пытается захватить доступ на запись в пределах timeout. | |
| void | unlockWrite () |
| Освобождает доступ на запись и пробуждает ожидающие потоки. | |
| void | lockRead () |
| Захватывает одно место читателя, ожидая пока активен доступ на запись. | |
| bool | tryLockRead () |
| Пытается захватить доступ на чтение без ожидания. | |
| bool | tryLockRead (PISystemTime timeout) |
| Пытается захватить доступ на чтение в пределах timeout. | |
| void | unlockRead () |
| Освобождает одно место читателя и пробуждает ожидающие потоки. | |
Примитив синхронизации, допускающий одновременных читателей и эксклюзивный доступ писателя.
Блокировка чтения/записи
PIReadWriteLock предоставляет более сложную межпотоковую защиту критических секций кода. PIReadWriteLock разрешает только одному потоку изменять данные, в то время как читать данные могут одновременно несколько потоков. Содержит методы: lockWrite(), tryLockWrite(), unlockWrite(), lockRead(), tryLockRead() и unlockRead().
Для автоматической блокировки на чтение и запись используйте PIReadLocker и PIWriteLocker.
Когда один поток блокирует запись с помощью функции lockWrite(), все остальные потоки (чтение и запись) не смогут получить доступ к данным, пока этот поток не вызовет unlockWrite(). Таким образом, блокировка записи работает аналогично мьютексу.
С другой стороны, несколько потоков могут одновременно считывать данные. Другими словами, функция lockRead() увеличивает счетчик потоков чтения, а функция unlockRead() уменьшает. Но поток не может считывать данные, пока другой поток заблокирован для записи.