互斥锁是否保证可见性(GLib)?

时间:2012-01-17 22:47:55

标签: c concurrency mutex glib

我正在使用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);
}

3 个答案:

答案 0 :(得分:1)

你应该按照这本书来工作,让实施互斥体的聪明人担心可见性和障碍。该书说,在阅读和写作时都应该使用互斥锁。

CPU可以重新排列读取,并做了很多。它有助于减少缓存未命中的影响,因为您在实际需要之前开始获取数据一段时间 因此,如果您在另一个CPU写入并释放锁之后读取变量,则实际上可以在这些事情发生之前执行读取 互斥体可以作为记忆障碍,防止出现这个问题(和其他人)。

答案 1 :(得分:0)

mutex对象只能通过g_static_mutex_*函数读取。如果您想知道是否可以获取互斥锁,可以使用此功能:

g_static_mutex_trylock 

在标识符的链接上,它遵循与任何其他C标识符相同的规则:它取决于声明的范围以及某个存储类说明符(例如staticextern )已指定。

答案 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-互斥保证其通也 - 不缓存) 但我不确定是否有必要使用互斥锁读取值。