Переменная состояния вместе с Mutex - PullRequest
3 голосов
/ 30 августа 2011

Немного путаницы! В чем может быть проблема, если мы посмотрим на следующий сценарий: Моя цель - понять смесь переменной условия с мьютексом.

T1

  1. LOCK {MUTEX}
  2. ПРОВЕРКА ПЕРЕМЕННАЯ
  3. ЕСЛИ НЕ УСТАНОВЛЕНО, ПОДОЖДИТЕ В ПЕРЕМЕННОМ СОСТОЯНИИ
  4. РАЗБЛОКИРОВАТЬ {MUTEX} ПЕРЕЙТИ НА 1

Т2

  1. ИЗМЕНИТЬ ПЕРЕМЕННОЙ;
  2. ПЕРЕМЕННОЕ СОСТОЯНИЕ СИГНАЛА

Между шагами 2 и 3 может быть состояние гонки, поэтому мы используем MUTEX. Что я не понимаю, так это основная идея cond var + mutex.

Ответы [ 3 ]

1 голос
/ 30 августа 2011

Существуют две проблемы с отсутствием блокировки на конце записи:

  1. Если изменяемая вами переменная не может быть записана в атомарном порядке (то есть она больше, чем int - хотя детали зависятна архитектуре процессора, которую вы используете!), вам нужна блокировка, чтобы у вас не было «сдвига».Это когда чтение происходит, когда переменная записана частично.Например, вы можете записать 0xAAAAAAAABBBBBBBB в 64-разрядную переменную, которая ранее была 0, а другой поток может видеть только 0xAAAAAAAA00000000 или 0x00000000BBBBBBBB.Блокировка не позволяет читателям видеть текущую запись, что позволяет избежать этой проблемы.
  2. Возможно, что читатель увидит вашу переменную в состоянии все еще нуждающегося в ожидании, затем, прежде чем она перейдет в спящий режим,автор может обновить переменную и сигнализировать переменную условия.В результате ваша нить засыпает навсегда.Блокировка на стороне записи предотвращает возникновение этого.

Обратите также внимание, что многие случаи использования переменных условия делают больше, чем просто изменяют флаг в блокировке - они могут манипулировать, например, связанными списками, илинекоторая другая сложная структура данных.В этом случае блокировка необходима для защиты этой структуры данных, а также для условной переменной.

1 голос
/ 30 августа 2011

Я беру некоторые предположения о вашем контексте и желаемом поведении, но я думаю, что вы хотите, чтобы все выглядело так:

T1:
1. lock mutex
2.проверить переменную
3. разблокировать мьютекс
4. дождаться условной переменной
5. перейти к 1

T2:
1. заблокировать мьютекс
2. изменить переменную
3. разблокировать мьютекс
4. переменная условия сигнала

Мьютекс предназначен для защиты доступа к переменной, чтобы у вас не было разных потоков, считывающих и записывающих все одновременно.

Переменная условия используется для синхронизации потоков, чтобы вы могли контролировать порядок, в котором все происходит.

0 голосов
/ 30 августа 2011

Вы делаете это неправильно.переменные условия имеют мьютекс, связанный с ними.Вам нужно заблокировать мьютекс перед тем, как изменить переменную и затем отпустить ее.

Нет мертвой блокировки - pthread_cond_wait получает связанный мьютекс в качестве параметра именно потому, что он может разблокировать мьютекс, когда вы блокируете свободным образом (он освобождает мьютекс, когда вы находитесь в очереди официантов дляпеременная условия, чтобы вы могли быть пробуждены при сигнале переменной состояния.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...