Гарантирует ли защита переменной с помощью мьютекса pthread, что она также не кэшируется? - PullRequest
33 голосов
/ 09 июля 2010

Рассмотрим простую (глобальную в моем случае) переменную:

int i;

Где-то эта переменная доступна

pthread_mutex_lock(i_mutex);
if(i == other value) {
  do_something();
}
pthread_mutex_unlock(i_mutex);

Другой поток обновляет i, пока он содержит i_mutex. Может ли компилятор кэшировать значение i так Я не понимаю недавнее значение? Должен ли i быть летучим?

Ответы [ 3 ]

35 голосов
/ 09 июля 2010

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

из http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11:

Следующие функции синхронизируют память по отношению к другим потокам:

fork()
pthread_barrier_wait()
pthread_cond_broadcast()
pthread_cond_signal()
pthread_cond_timedwait()
pthread_cond_wait()
pthread_create()
pthread_join()
pthread_mutex_lock()       // <====
pthread_mutex_timedlock()
pthread_mutex_trylock()
pthread_mutex_unlock()     // <====
pthread_spin_lock()
pthread_spin_trylock()
pthread_spin_unlock()
pthread_rwlock_rdlock()
pthread_rwlock_timedrdlock()
pthread_rwlock_timedwrlock()
pthread_rwlock_tryrdlock()
pthread_rwlock_trywrlock()
pthread_rwlock_unlock()
pthread_rwlock_wrlock()
sem_post()
sem_timedwait()
sem_trywait()
sem_wait()
semctl()
semop()
wait()
waitpid()
5 голосов
/ 09 июля 2010

Компилятор не должен кэшировать такое глобальное значение при вызове функции.

Но я думаю, что ваш вопрос некорректен. Во-первых, мьютекс POSIX работает только тогда, когда вы придерживаетесь их семантики. Таким образом, вы должны применить некоторую дисциплину в своем коде для доступа только к глобальным переменным (в данном случае i), откуда ваш мьютекс удерживается.

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

2 голосов
/ 09 июля 2010

Простые ответы на ваш вопрос:
- Нет, я буду самым последним значением.
- Нет, я не должен быть изменчивым.

i_mutex защищает ваш доступ к i ... пока вы блокируете мьютекс каждый каждый раз, когда вы читаете и пишете его. Все просто.

Другими словами, вам не нужно беспокоиться о кэшировании или энергозависимости.

Наслаждайтесь, Randy

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