gpt4 book ai didi

c++ - volatile 不适合任何范式

转载 作者:太空宇宙 更新时间:2023-11-04 05:05:47 25 4
gpt4 key购买 nike

<分区>

只有我这么想吗? [一秒钟真正的问题。]

除了关于它的巨大混淆,以及它与互斥锁或其他锁定机制的混合,当我处理线程安全情况时,我总是不得不放弃对 volatile 的任何使用,因为它只是没有做任何有用的事情。

volatile“禁止对读/写进行任何重新排序或缓存”,但只要 volatile 只是标记单个对象<,这就没有多大用处(并污染它,因为它不再是“正常”对象)。

考虑一下:

Thread A            Thread B
reads vars
locks mutex (gets access)
locks mutex (waits)
writes some vars
releases mutex
reads vars again
releases mutex

现在,编译器可能想要优化两个线程 A 的读取,将一些结果保存在寄存器中。你说我应该将这些变量声明为 volatile。我说我不想将所有东西都标记为 volatile,因为 volatile 像石头一样透明,我必须复制 50% 的代码来支持 volatile 类型。您( he )说锁定互斥锁(至少是 POSIX 互斥锁)要么是编译器可以识别并正确管理的东西,要么是对可以改变世界的库(编译器无法访问)的调用,所以在这样的调用之后,编译器不会假设任何东西。我说这太依赖于实现,非常低级的东西(而且我不想浏览开发文档以进行日常编程)。更糟糕的是,如果由于某种原因“外部库”出于任何合法原因变得可供编译器访问,它可能会突然改变(也许作者将函数转换为必须包含在标题中的模板......无论如何) .

所以,在我看来,volatile 是完全没有用的(并且具有误导性),除非是一些非常低级的东西(设备读取可能,但我不擅长这个领域)。

更好的办法是通过其他方式明确告诉编译器它必须放弃关于任何变量的任何假设,并且每个后续读取必须是真正的内存读取。但我无法想象有什么比调用虚拟外部函数更好的了,而且这会遇到我之前概述过的相同问题。有没有一种优雅的方式来做到这一点?

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