Составители:
18
критической секции, до тех пор пока замок не откроется. На рис. 2.1 показа-
на мнемоническая схема функционирования мьютекса для потоков.
Thread 1
Thread 2
Thread 3
Mutex
Thread 1
Thread 2
Thread 3
lock
lock
lock
Running
Blocked
Blocked
Рис. 2.1
Для реализации механизма используются 2 вызова, окружающие кри-
тическую секцию программного кода:
pthread_mutex_lock() // захватить мьютекс
pthread_mutex_unlock() // освободить мьютекс
В любой момент времени только один поток может владеть мьютексом.
Другие потоки, которые попытаются получить доступ к критической секции,
будут блокированы, до тех пор пока владелец мьютекса не освободит его.
Новым хозяином мьютекса станет конкурирующий поток, который имеет
максимальный приоритет, а в случае равенства приоритетов – первый по-
ток из очереди потоков, готовых к исполнению. В хорошей программе время
исполнения критической секции должно быть минимальным. В примере 1
опущены системные вызовы создания мьютекса и программных потоков.
Существует также неблокирующий вызов (pthread_mutex_trylock()), ко-
торый может быть использован для разовой проверки занятости мьютекса.
В этом случае проверяющий поток не блокируется, но получает информа-
цию о состоянии мьютекса.
ПРИМЕР 1
int count = 0; /* Критическая область состоит из одной глобальной переменной
count */
/***************************************************************/
void* function1( void* arg ) // поток 1
{
while( 1 ) { // бесконечный цикл
pthread_mutex_lock( &mutex ); /* захват мьютекса (неудача приводит к блокировке те-
кущего потока) */
count++; // изменение критической переменной (увеличение на 1)
pthread_mutex_unlock( &mutex ); // Освобождение мьютекса
}
return 0;
}
/***************************************************************/
void* function2( void* arg ) // поток 2
Страницы
- « первая
- ‹ предыдущая
- …
- 16
- 17
- 18
- 19
- 20
- …
- следующая ›
- последняя »
