Синхронизация и взаимодействие программных потоков в операционной среде реального времени. Дорогов А.Ю. - 19 стр.

UptoLike

Составители: 

19
{
while( 1 ) { // бесконечный цикл
pthread_mutex_lock( &mutex ); /* захват мьютекса (неудача приводит к блокировке те-
кущего потока) */
count--; // изменение критической переменной (уменьшение на 1)
pthread_mutex_unlock( &mutex ); // освобождение мьютекса
}
return 0;
}
Если поток с приоритетом, большим чем приоритет владельца мьютек-
са, пытается захватить мьютекс, то эффективный приоритет текущего соб-
ственника будет увеличиваться до уровня максимального приоритета груп-
пы потоков, ожидающих мьютекс, что приводит к быстрому исполнению
критической секции и освобождению мьютекса. Прежний собственник мью-
текса после исполнения возвращается к своему реальному приоритету. Эта
схема обеспечивает малое ожидание для высокопроизводительных про-
цессов.
При инициализации мьютекса можно задать 2 его атрибута:
protocol с возможными значениями:
– PTHREAD_PRIO_INHERIT (значение по умолчанию) – увеличивает
приоритет текущего собственника мьютекса до уровня максимального при-
оритета группы потоков, ожидающих мьютекс;
– PTHREAD_PRIO_PROTECT – увеличивает приоритет текущего соб-
ственника мьютекса до максимума в группе всех потоков, инициализиро-
вавших данный мьютекс с атрибутом PTHREAD_PRIO_PROTECT в неза-
висимости от того, блокированы эти потоки или нет в текущий момент;
recursive с возможными значениями:
– PTHREAD_RECURSIVE_ENABLE – собственник мьютекса может за-
хватить его опять без блокировки;
– PTHREAD_RECURSIVE_DISABLE (значение по умолчанию) – любой
поток, в том числе и собственник мьютекса, блокируется при попытке за-
хвата мьютекса, если он уже захвачен.
2.2. Дополнительные сервисы QNX-Neutrino
Стандарт POSIX утверждает, что с мьютексом должны работать пото-
ки одного и того же процесса, но позволяет в соответствующей реализации
эту концепцию расширять. В QNX-Neutrino это расширение сводится к тому,
что мьютекс может использоваться потоками различных процессов. Объяс-
няется это тем, что ядро работает только с потоками и ему все равно какие
потоки работают в каких процессах.
Другое существенное дополнение QNX-Neutrino – это пулы потоков.
Пулэто несколько потоков-клонов, полностью идентичных друг другу. Пул