gpt4 book ai didi

c - 如果锁可以防止使用 volatile

转载 作者:行者123 更新时间:2023-12-02 18:10:35 29 4
gpt4 key购买 nike

如果不使用 volatile ,我怎么知道变量是从内存中读取而不是注册的。

static uint64 counter;

void thread(void *arg){
while(counter < (uint64)arg){
acquire(&lock)
counter++;
release(&lock);
}
}

我以前从来没有怀疑过这一点,但是如果有编译器优化,它不会产生不好的结果。我还发现 volatile 在 xv6 内核代码中很少见,我想知道是否有一些技巧可以通过编译器的命令行抑制优化以防止使用 volatile。

最佳答案

只要你的锁定库正确实现,你就不需要 volatile - 它(通过设计)将保证正确的行为,尽管编译器优化,线程竞争相同的资源,调度在其他处理器和内核等上。

正确实现的acquirerelease将保证编译器不会产生不需要的重新排序,更重要的是,它还将保证处理器(及其关联的缓存 Controller )不会产生不需要的重新排序(这可能发生在某些处理器架构上,即使编译器发出所需的操作序列)。

实现此目的的一种方法是使用障碍。我将其更多地作为对事物如何工作的解释,而不是作为手写此类同步代码的建议:

  • acquire 函数包含一个具有“获取语义”的所谓的内存屏障 - 获取屏障意味着它后面的任何代码(即内部的代码)临界区)不得重新排序以发生在屏障之前。这意味着任何其他线程和处理器都必须在对临界区进行任何写入操作之前看到锁的获取。

  • release 函数提供了一个类似的内存屏障,可防止临界区中的任何内容在屏障之后重新排序。这可以确保其他线程在看到锁被释放之前能够看到临界区的效果。

除非您正在编写一个低级库并准备彻底证明、验证和测试它,否则您不应该自己编写这种屏障代码。很容易犯细微的错误、性能低下等。

关于c - 如果锁可以防止使用 volatile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72416873/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com