似乎volatile
实现中的shared_ptr
比较函数不存在。
存在是否有意义?
答案 0 :(得分:4)
基本上不行,该标准不适合volatile shared_ptr
上的comparisons或boolean conversion。
要编译的following fails ...
auto main() -> int {
volatile shared_ptr<int> a;
if (a == nullptr) // fails
; // empty
if (a) // fails
; // empty
}
您可以关闭volatile
(通过。const_cast
),但我不确定是否会产生预期结果。来自cppreference:
通过非
const
访问路径修改const
对象并通过非volatile
glvalue引用volatile
对象会导致未定义的行为。
更一般地说,在不将成员方法标记为volatile
时,类或库实现者实际上是在说“这不是用作volatile
对象” - 如果是,然后适当的方法或重载将提供volatile
个对象。同样,这适用于const
,在将成员标记为const
时,他们会说“此类可用作const
对象。
为什么需要volatile
,在没有编译器知识的情况下,外部资源可以修改shared_ptr
“(这是volatile
的用法之一)?如果存在线程问题,那么你可以更好地使用一个线程库实用程序,或者如果需求只是关闭优化,各种编译器已经有了这种机制(pragma等)。
答案 1 :(得分:3)
Volatile只是指示编译器内存可能会意外更改。关闭一些优化。在封面下它只是一个内存地址。
共享指针只是持有/管理资源。也就是说,由于std :: shared_ptr :: get()没有标记为volatile,因此您无法真正使用shared_ptr以易于访问的方式管理易失性指针。
我建议使用裸指针,并使用范围退出或destructer来清理它。
如果您使用volatile,因为指针可能被另一个线程修改,您可能需要考虑使用std :: atomic而不是volatile。在线程工作流中,在std::atomic之前,从其他线程访问的指针通常标记为volatile。这不再是最佳做法。