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(使用前将#替换为@)