用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或不稳定。

享受,兰迪