Для условных переменных все еще нужно взаимное исключение при изменении проверенного значения атомарно?

Вот типичный способ использовать условную переменную:

// The reader(s)
lock(some_mutex);
if(protected_by_mutex_var != desired_value)
    some_condition.wait(some_mutex);
unlock(some_mutex);

// The writer
lock(some_mutex);
protected_by_mutex_var = desired_value;
unlock(some_mutex);
some_condition.notify_all();

Но если protected_by_mutex_var установлен атомарно, говорят, инструкция сравнивать-и-подкачивать, взаимное исключение служит какой-либо цели (кроме этого, pthreads и другие API требуют, чтобы Вы передали во взаимном исключении)? Это защищает состояние, используемое для реализации условия? В противном случае действительно ли безопасно затем сделать это?:

// The writer
atomic_set(protected_by_mutex_var, desired_value);
some_condition.notify_all();

С устройством записи, никогда непосредственно взаимодействующим со взаимным исключением читателя? Обратите внимание, что имя 'protected_by_mutex_var' больше не является действительно соответствующим (это не взаимное исключение, защищенное больше). Если так, даже необходимо, чтобы различные читатели использовали то же взаимное исключение?

15
задан Joseph Garvin 27 March 2010 в 23:41
поделиться

1 ответ

Представьте себе следующий сценарий:

| Thread 1                                            | Thread 2                                           |
| if(protected_by_mutex_var != desired_value) -> true |                                                    |
|                                                     | atomic_set(protected_by_mutex_var, desired_value); |
|                                                     | some_condition.notify_all();                       |
| some_condition.wait(some_mutex);                    |                                                    |

В этой ситуации поток 1 ожидает уведомления, которое может никогда не прийти. Потому что операторы, действующие на условие не является частью набора переменной чтения / атомарного, это представляет состояние гонки.

Эффективное использование мьютекса делает эти действия неотделимыми (при условии, что все обращения к переменной ведут себя правильно и блокируют мьютекс).

14
ответ дан 1 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: