为什么 POSIX mmap 不返回 volatile void*?

2024-02-11

mmap 返回 void*,但不是volatile void*。如果我使用 mmap 来映射共享内存,那么另一个进程可能正在写入该内存,这意味着从同一内存位置进行的两次后续读取可能会产生不同的值 - 这正是 volatile 所针对的情况。那么为什么它不返回 volatile void* 呢?

我最好的猜测是,如果您有一个专门写入共享内存段的进程,则它不需要通过易失性指针查看共享内存,因为它始终对当前存在的内容有正确的理解;编译器为防止冗余读取所做的任何优化都无关紧要,因为没有其他任何东西可以写入和更改其脚下的值。还是有其他历史原因?我倾向于说回归volatile void*将是一个更安全的默认值,那些想要这种优化的人可以手动转换为 void*。

POSIX mmap 描述:http://opengroup.org/onlinepubs/007908775/xsh/mmap.html http://opengroup.org/onlinepubs/007908775/xsh/mmap.html


实现共享内存只是使用的一小部分mmap()。事实上,最常见的用途是创建私有映射,包括匿名映射和文件支持映射。这意味着,即使我们接受您关于要求volatile用于共享内存访问的限定指针,在一般情况下这样的限定符是多余的。

请记住,您始终可以add无需强制转换即可将最终限定符添加到指针类型,但无法删除它们。所以,以目前的mmap()声明,您可以执行以下操作:

volatile char *foo = mmap();  /* I need volatile */

和这个:

char *bar = mmap();  /* But _I_ do not */

根据您的建议,用户common情况下必须抛弃挥发性的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 POSIX mmap 不返回 volatile void*? 的相关文章

随机推荐