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

UptoLike

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

20
предназначен для того, чтобы увеличить скорость обслуживания запросов.
Идея состоит в том, что если один из потоков пула занят обслуживанием и
не может принять запрос на обработку, тогда другой поток из этого пула об-
служит новый запрос. При необходимости размером пула можно управлять.
2.3. Условные переменные
Условные переменные, или CONDVAR, используются для блокировки
потока до тех пор, пока не будет выполнено некоторое условие. Условие
может быть произвольной сложности и не зависит от объекта CONDVAR.
Объект CONDVAR должен быть всегда использован с мьютексом, для того
чтобы выполнить безопасный мониторинг условия. Объект CONDVAR под-
держивается тремя системными вызовами:
wait (pthread_cond_wait()) блокировка по условию
signal (pthread_cond_signal()) деблокировка приоритетного потока
broadcast (pthread_cond_broadcast()) – деблокировка всех потоков
Рассмотрим использование этих вызовов на примере. В примере 2 оп-
ределены 2 конкурирующих потока consume (потребитель) и produce (про-
изводитель).
ПРИМЕР 2
int condition = 0; // условие, связанное с cond
int count = 0; // переменная критической секции
/**********************************************************/
int consume( void ) // поток-потребитель данных
{
while( 1 )
{
pthread_mutex_lock( &mutex ); // захват мьютекса
while( condition == 0 )
pthread_cond_wait( &cond, &mutex ); /* блокировка потока по CONDVAR cond */
printf( "Consumed %d\n", count );
condition = 0;
pthread_cond_signal( &cond ); // деблокировка потока, ожидающего cond
pthread_mutex_unlock( &mutex ); // освобождение мьютекса
}
return( 0 );
}
/**********************************************************/
void* produce( void * arg ) // поток-производитель данных
{
while( 1 )
{
pthread_mutex_lock( &mutex ); // захват мьютекса
while( condition == 1 )
pthread_cond_wait( &cond, &mutex ); /* блокировка потока по CONDVAR cond */
printf( "Produced %d\n", count++ );
condition = 1;
pthread_cond_signal( &cond ); // деблокировка потока, ожидающего cond
pthread_mutex_unlock( &mutex ); // освобождение мьютекса
}
return( 0 );
}