Считайте простое (глобальным в моем случае) переменной:
int i;
Где-нибудь к этой переменной получают доступ
pthread_mutex_lock(i_mutex);
if(i == other value) {
do_something();
}
pthread_mutex_unlock(i_mutex);
Другой поток обновления i
в то время как это содержит i_mutex
. Мог компилятор кэшировать значение i
таким образом, я не получаю недавнее значение? Должен i
быть энергозависимыми?
Блокировки 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 () семоп () ждать() waitpid ()
Компилятор не должен кэшировать такое глобальное значение через вызов функции.
Но я думаю, что ваш вопрос поставлен некорректно. Во-первых, мьютексы POSIX работают только тогда, когда вы придерживаетесь их семантики. Поэтому вы должны применить некоторую дисциплину в своем коде, чтобы обращаться к глобальным переменным (i
в этом случае) только тогда, когда ваш мьютекс удерживается.
Во-вторых, не думайте, что объявление volatile
убережет вас от любого ущерба, который может нанести такое несоблюдение правил доступа. Одновременное чтение и запись в память - тонкая тема.
Простые ответы на ваш вопрос:
- Нет, я буду самым последним значением.
- Нет, я не обязательно должен быть изменчивым.
i_mutex защищает ваш доступ к i ... до тех пор, пока вы блокируете мьютекс каждый раз, когда вы его читаете и записываете. Просто как тот.
Другими словами, вам не нужно беспокоиться о кешировании или изменчивости.
Наслаждайтесь, Рэнди