用pthread mutex守护一个variables是否保证它也没有被caching?
考虑一个简单的(全局在我的情况下)variables:
int i;
在某个地方访问这个variables
pthread_mutex_lock(i_mutex); if(i == other value) { do_something(); } pthread_mutex_unlock(i_mutex);
另一个线程更新i
而它拥有i_mutex
。 编译器可以cachingi
的值,所以我没有得到最近的值? i
必须变动吗?
pthread锁实现了内存屏障,可确保caching效果对其他线程可见。 如果共享variables的访问受pthread互斥锁保护,则不需要volatile来正确处理共享variablesi
。
从http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11 :
以下function可以使内存与其他线程同步:
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()
编译器不应该在函数调用中caching这样一个全局值。
但是我认为你的问题是不适当的。 首先,POSIX互斥体只有在坚持语义的情况下才能正常工作。 所以你必须在你的代码中应用一些规则来只访问全局variables(在这种情况下, i
的互斥锁)。
其次,请不要认为volatile
声明会阻止您对访问规则的不尊重导致的任何损害。 并发读取和写入内存是一个微妙的主题。
你的问题的简单答案是:
– 不,我会是最近的价值。
– 不,我不一定要动摇。
i_mutex保护您对我的访问…只要您每次读取和写入时都locking互斥锁。 就那么简单。
换句话说,你不必担心caching或不稳定。
享受,兰迪