是否足以保证不会有对对象的并发调用std::mutex
?std::unique_ptr
在下面的代码片段中会Object
不会有任何并发调用?
class Example {
public:
std::mutex Mutex;
Example(){...
};
//
private:
static std::unique_ptr<Object> Mutex;
};
是否足以保证不会有对对象的并发调用std::mutex
?std::unique_ptr
在下面的代码片段中会Object
不会有任何并发调用?
class Example {
public:
std::mutex Mutex;
Example(){...
};
//
private:
static std::unique_ptr<Object> Mutex;
};
不,您必须在需要时锁定和解锁mutex
。只是不能保证互斥体的存在。这也是一个unique_ptr
无法改变的!
然而,const 现在确实保证除了您使用 const 之外,没有任何东西可以同时更改您的对象。 这显然假设您使用了一个编码良好的对象(如 STL 容器)并且没有人试图绕过编译器检查。
见:http ://herbsutter.com/2013/01/01/video-you-dont-know-const-and-mutable/
unique_ptr 主要与资源管理和 RAII 习语有关。您不需要使用 unique_ptr 来实现线程安全,即使在某些情况下它可能被证明是有用的。但是,您提供的示例有点不寻常,您使用了两次标识符 Mutex 来指示 std::mutex 和 std::unique_ptr。
我建议在深入了解并发和资源管理等更复杂的主题之前,先阅读一些关于 C++ 的好书。
Diego Dagum 的这篇不错的文章解释了 C++11 中关于并发的新特性 http://msdn.microsoft.com/en-us/magazine/hh852594.aspx
还有一篇关于unique_ptr的文章: http ://www.drdobbs.com/cpp/c11-uniqueptr/240002708