Слайд 2Условные переменные
Условные переменные используются для того, чтобы заблокировать потоки до выполнения определенных
условий. Условные переменные применяются в сочетании мьютексам, чтобы несколько потоков могли ожидать момента выполнения одного условия.
Сначала поток блокирует мьютекс, но и сам блокируется с помощью системного вызова ожидания условно переменной до момента выполнения условия. На то время, пока поток заблокирован, установленная им блокировка мьютекса автоматически снимается. Когда другой поток выполняет поставленное условие, он дает условной переменной сигнал (не имеющий отношения к сигналам unix) о разблокировании первого потока. После блокировки потока мьютекс автоматически устанавливается и первый поток повторно проверяет условие. Если оно не выполняется, поток опять блокируется переменной. Если условие выполняется, поток разблокирует мьютекс и выполняется дальше.
Слайд 3Условные переменные
Концептуально, условная переменная — это очередь потоков, ассоциированных с разделяемым объектом данных,
которые ожидают выполнения некоторого условия, накладываемого на состояние данных. Таким образом, каждая условная переменная связана с утверждением Pc. Когда поток находится в состоянии ожидания на условной переменной, он не считается владеющим данными и другой поток может изменить разделяемый объект и просигнализировать ожидающим потокам в случае выполнения утверждения Pc.
Слайд 4Системные вызовы для работы условными переменными
Слайд 5Системный вызов pthread_cond_init
#include
int pthread_cond_init (pthread_cond_t *cond const pthread_condattr_t *attr);
pthread_cond_t cond
= PTHREAD_COND_INITIALIZER;
Инициализирует атрибутный объект условной переменной, заданный параметром attr, значениями, действующими по умолчанию для всех атрибутов, определенных реализацией.
Слайд 6Системный вызов pthread_cond_wait
#include
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
При вызове
pthread_cond_wait mutex должен быть захвачен, в противном случае результат не определен. pthread_cond_wait освобождает mutex и блокирует вызывающий поток до момента вызова другим потоком pthread_cond_signal или pthread_cond_broadcast. После пробуждения pthread_cond_wait пытается захватить mutex; если это не получается, он блокируется до того момента, пока mutex не освободят.
Слайд 9Блокировки чтения-записи
Обычно чтение данных выполняется чаще, чем изменение и запись. В таких
случаях можно заблокировать данные таким образом, чтобы несколько нитей могли одновременно считывать данные, и только одна нить могла их изменять. Для этого предназначена блокировка типа "несколько читателей, один писатель", или блокировка чтения-записи. Блокировка чтения-записи захватывается для чтения или записи, а затем освобождается. Освободить блокировку чтения-записи может только та нить, которая ее захватила.
Слайд 10Блокировки чтения-записи
Блокировки чтения-записи похожи на мьютексы, за исключением того, чтоони допускают более
высокую степень параллелизма. Мьютексы могут иметь всего два состояния, закрытое и открытое, и только один поток может владеть мьютексом в каждый момент времени. Блокировки чтения-записи могут иметь три состояния: режим блокировки для чтения, режим блокировки для записи и отсутствие блокировки. Режим блокировки для записи может установить только один поток, но установка режима блокировки для чтения доступна нескольким потокам одновременно.
Слайд 11Если блокировка чтения-записи установлена в режиме блокировки для записи, все потоки, которые
будут пытаться захватить эту блокировку, будут приостановлены до тех пор, пока блокировка не будет снята.
Если блокировка чтения-записи установлена в режиме блокировки для чтения, все потоки, которые будут пытаться захватить эту блокировку для чтения, получат доступ к ресурсу, но если какой-либо поток попытается установить режим блокировки для записи, он будет приостановлен до тех пор, пока не будет снята последняя блокировка для чтения. Различные реализации блокировок чтения-записи могут значительно различаться, но обычно, если блокировка для чтения уже установлена и имеется поток, который пытается установить блокировку для записи, то остальные потоки, которые пытаются получить блокировку для чтения, будут приостановлены. Это предотвращает возможность блокирования пишущих потоков непрекращающимися запросами на получение блокировки для чтения.
Слайд 12Блокировки чтения-записи еще называют совместноисключающими блокировками. Когда блокировка чтения-записи установлена в режиме
для чтения, то говорят, что блокировка находится в режиме совместного использования.
Когда блокировка чтения-записи установлена в режиме для записи, то говорят, что блокировка находится в режиме исключительного использования.