c - 互斥量是否保证可见性 (GLib)?

标签 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);
}

最佳答案

您应该按部就类,让实现互斥锁的聪明人担心可见性和障碍。书上说在读和写的时候都应该持有一个互斥体。

CPU 可以重新排列读取,并且经常这样做。它有助于减少缓存未命中的损失,因为您在实际需要数据之前就开始获取数据了。
因此,如果您在另一个 CPU 写入变量并释放锁后读取变量,则读取实际上可能在这些事情发生之前执行。
互斥量充当内存屏障,防止出现此问题(以及其他问题)。

关于c - 互斥量是否保证可见性 (GLib)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8902776/

相关文章:

python - 如何制作 Cython 对象的副本?

c - 没有锁的一插入多读列表安全吗?

c++ - boost::mutex::~mutex(): 断言 `!pthread_mutex_destroy(&m)' 失败

c - 在信号处理程序中修改全局变量时是否需要互斥锁

c++ - 如何在 Ruby 和另一种语言之间共享文本文件(或互斥量/信号量)?

c - AES_cfb128_使用openssl命令加密和解密

c - 有没有办法使 Eclipse 的代码完成与 XCode 的一样好?

c - C 语言的简单 GCD 程序,无法从扫描仪过滤正确的用户输入

python - 使用相同的参数运行相同的函数 10 次并获得结果

haskell - 与 orElse 嵌套的 STM 事务中的验证