Книга: UNIX: взаимодействие процессов
Исключение конфликтов блокировок
Исключение конфликтов блокировок
В приведенном выше фрагменте кода, как и в листинге 7.6, функция pthread_cond_signal вызывалась потоком, блокировавшим взаимное исключение, относящееся к условной переменной, для которой отправлялся сигнал. Мы можем представить себе, что в худшем варианте система немедленно передаст управление потоку, которому направляется сигнал, и он начнет выполняться и немедленно остановится, поскольку не сможет заблокировать взаимное исключение. Альтернативный код, помогающий этого избежать, для листинга 7.6 будет иметь следующий вид:
int dosignal;
Pthread_mutex_lock(nready.mutex);
dosignal = (nready.nready == 0);
nready.nready++;
Pthread_mutex_unlock(&nready.mutex);
if (dosignal)
Pthread_cond_signal(&nready.cond);
Здесь мы отправляем сигнал условной переменной только после разблокирования взаимного исключения. Это разрешено стандартом Posix: поток, вызывающий pthread_cond_signal, не обязательно должен в этот момент блокировать связанное с переменной взаимное исключение. Однако Posix говорит, что если требуется предсказуемое поведение при одновременном выполнении потоков, это взаимное исключение должно быть заблокировано процессом, вызывающим pthread_cond_signal.
- Устранение конфликтов имен WSDL с помощью свойства MessageName
- 4.1. Типы конфликтов налоговых юрисдикций
- Массовая культура — исключение, а не правило
- 14.2.2.2. Установка и снятие блокировок
- 14.2.2.3. Предостережения по поводу блокировок
- Разрешение конфликтов имен
- Сравнение спин-блокировок и семафоров
- Разрешение конфликтов шаблонов
- Глава 23 Исключение из правил
- 11 Исключение непроизводительных затрат времени
- 5.2.1. Порядок разрешения конфликтов норм внутреннего и международного права
- Разрешение конфликтов посредством линейного зондирования