我正在使用Glib的互斥实用程序来处理并发。是否可以保证在解锁互斥锁后,任何其他线程都可以看到修改后的变量的更新版本? 这些线程是否也必须锁定互斥锁才能安全地读取它?
GStaticMutex mutex;
int value;
void init() {
g_static_mutex_init(&mutex);
value = 0;
}
void changeValue() {
g_static_mutex_lock(&mutex);
value = generateRandomNumber();
g_static_mutex_unlock(&mutex);
}
答案 0 :(得分:1)
你应该按照这本书来工作,让实施互斥体的聪明人担心可见性和障碍。该书说,在阅读和写作时都应该使用互斥锁。
CPU可以重新排列读取,并做了很多。它有助于减少缓存未命中的影响,因为您在实际需要之前开始获取数据一段时间
因此,如果您在另一个CPU写入并释放锁之后读取变量,则实际上可以在这些事情发生之前执行读取
互斥体可以作为记忆障碍,防止出现这个问题(和其他人)。
答案 1 :(得分:0)
mutex
对象只能通过g_static_mutex_*
函数读取。如果您想知道是否可以获取互斥锁,可以使用此功能:
g_static_mutex_trylock
在标识符的链接上,它遵循与任何其他C标识符相同的规则:它取决于声明的范围以及某个存储类说明符(例如static
或extern
)已指定。
答案 2 :(得分:0)
我想我找到了答案。 Gthread是pthread的包装器(根据http://redmine.lighttpd.net/boards/3/topics/425),pthreads似乎实现了内存屏障(http://stackoverflow.com/questions/3208060/does-guarding-a-variable-with-a-pthread-互斥保证其通也 - 不缓存) 但我不确定是否有必要使用互斥锁读取值。