我正在使用 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);
}
最佳答案
您应该按部就类,让实现互斥锁的聪明人担心可见性和障碍。书上说在读和写的时候都应该持有一个互斥体。
CPU 可以重新排列读取,并且经常这样做。它有助于减少缓存未命中的损失,因为您在实际需要数据之前就开始获取数据了。
因此,如果您在另一个 CPU 写入变量并释放锁后读取变量,则读取实际上可能在这些事情发生之前执行。
互斥量充当内存屏障,防止出现此问题(以及其他问题)。
关于c - 互斥量是否保证可见性 (GLib)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902776/