(与此问题相关的问题是Is It Safe to Cast Away volatile?,但并不完全相同,因为那个问题涉及到一个特定的实例)
是否存在一种情况,其中强制转换volatile
被认为是不危险的?
(一个特别的例子:如果有一个声明的函数
void foo(long *pl);
我需要实现这个功能
void bar(volatile long *pl);
如果我的一部分实现需要bar()调用foo(pl),但似乎我无法让其正常工作,因为编译foo()和调用bar()的编译所做出的假设是不兼容的。
作为推论,如果我有一个volatile
变量v,我想要调用别人的函数void foo(long *pl)
并将v的地址传递给它,并且那个人告诉我这样做是安全的,我的直觉告诉我告诉他们是错误的,因为没有办法保证这是安全的,如果他们想要支持使用volatile变量,他们应该将声明更改为void foo(volatile long *pl)
。哪个正确?
foo()
函数应该是原子递增的,那么有可能从两个线程调用bar()并且失去其中一个递增。 - Jason Svolatile
不能提供原子变量,因此无论如何都不足够。 - AJG85foo
可能已经应该使用volatile指针。例如,如果foo
是原子递增,那么强制转换掉volatile
应该是无害的,因为原子操作已经提供了比volatile
更强的保证... - R.. GitHub STOP HELPING ICE