codememo

pthread mutex로 변수를 보호하면 캐시되지 않는 것이 보장됩니까?

tipmemo 2023. 9. 15. 21:02
반응형

pthread mutex로 변수를 보호하면 캐시되지 않는 것이 보장됩니까?

단순한(내 경우에는 전역적) 변수를 생각해 보십시오.

int i;

이 변수가 접근되는 곳은

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

다른 스레드 업데이트i있는 한i_mutex. 컴파일러가 다음의 값을 캐시할 수 있습니까?i최근의 가치를 알 수 없는 건가요?해야한다i변덕스럽습니까?

pthread lock은 캐시 효과가 다른 스레드에 표시되도록 보장하는 메모리 장벽을 구현합니다.공유 변수를 적절하게 처리하기 위해 휘발성이 필요하지 않습니다.i공유 변수에 대한 액세스가 pthread mutexes에 의해 보호되는 경우.

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()

컴파일러는 함수 호출 전체에 걸쳐 이러한 전역 값을 캐시해서는 안 됩니다.

하지만 당신의 질문은 잘못된 것 같습니다.첫째, POSIX mutex는 의미론을 고수할 때만 작동합니다.따라서 전역 변수에만 접근하기 위해 코드에 약간의 규율을 적용해야 합니다 (i그 경우) 뮤텍스가 고정되어 있을 때.

둘째, 그렇게 생각하지 말아 주세요.volatile선언문은 접근 규칙을 무시할 경우 발생할 수 있는 어떠한 손상도 방지할 수 있습니다.메모리에 읽기와 쓰기를 동시에 하는 것은 미묘한 주제입니다.

질문에 대한 간단한 답변은 다음과 같습니다.
- 아니요, 제가 가장 최근의 값이 되겠습니다.
- 아니요, 제가 변덕을 부릴 필요는 없습니다.

i_mutex는 사용자가 읽고 쓸 때마다 mutex를 잠그는 한 i...에 대한 액세스를 보호합니다.그렇게 간단합니다.

즉, 캐싱이나 휘발성에 대해 걱정할 필요가 없습니다.

즐겨, 랜디

언급URL : https://stackoverflow.com/questions/3208060/does-guarding-a-variable-with-a-pthread-mutex-guarantee-its-also-not-cached

반응형