Защита переменной с pthread взаимным исключением гарантируют, что она также не кэшируется?

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

int i;

Где-нибудь к этой переменной получают доступ

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

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

33
задан Manuel Selva 13 January 2014 в 13:39
поделиться

3 ответа

Блокировки 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 ()
36
ответ дан 27 November 2019 в 18:33
поделиться

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

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

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

5
ответ дан 27 November 2019 в 18:33
поделиться

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

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

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

Наслаждайтесь, Рэнди

2
ответ дан 27 November 2019 в 18:33
поделиться
Другие вопросы по тегам:

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