C++11 C++;11保证没有并发调用

C++11 C++;11保证没有并发调用,c++11,C++11,std::mutex和std::unique\u ptr是否足以保证不会同时调用对象?在下面的代码段中,Object是否没有任何并发调用 class Example { public: std::mutex Mutex; Example(){... }; // private: static std::unique_ptr<Object> Mutex; }; 类示例{ 公众: std::互斥互斥; 示例(){。。。 }; // 私人: 静态std::唯一的ptr互斥体; }; 不,

std::mutex
std::unique\u ptr
是否足以保证不会同时调用对象?在下面的代码段中,
Object
是否没有任何并发调用

class Example {
public:
std::mutex Mutex;
Example(){...
};
//
private:
static std::unique_ptr<Object> Mutex;
};
类示例{
公众:
std::互斥互斥;
示例(){。。。
};
//
私人:
静态std::唯一的ptr互斥体;
};

不,需要时必须锁定和解锁
互斥锁。只是存在一个互斥锁,这并不能保证。另外,
唯一\u ptr
也无法更改此设置


互斥锁示例在参考中:

否,需要时必须锁定和解锁互斥锁。只是存在一个互斥锁,这并不能保证。另外,
唯一\u ptr
也无法更改此设置


互斥示例在参考中:

Const但是现在可以保证在使用Const的同时,没有任何东西可以更改对象。 这显然是假设您使用了编码良好的对象(如STL容器),并且没有人尝试绕过编译器检查


请参阅:

Const现在可以保证,在使用Const的同时,任何东西都不能更改对象。 这显然是假设您使用了编码良好的对象(如STL容器),并且没有人尝试绕过编译器检查


请参阅:

unique\u ptr主要与资源管理和RAII习惯用法有关。您不需要使用unique_ptr来实现线程安全,即使在某些情况下,它可能会被证明是有用的。但是,您提供的示例有点不寻常,您使用了两次标识符互斥来表示std::Mutex和std::unique_ptr

我建议先从C++获得一些好的书籍,然后再讨论更复杂的话题,比如并发和资源管理。 Diego Dagum的这篇好文章解释了C++11中关于并发性的新内容

还有一篇关于unique_ptr的文章:

独特的ptr主要与资源管理和RAII习惯用法有关。您不需要使用unique_ptr来实现线程安全,即使在某些情况下,它可能会被证明是有用的。但是,您提供的示例有点不寻常,您使用了两次标识符互斥来表示std::Mutex和std::unique_ptr

我建议先从C++获得一些好的书籍,然后再讨论更复杂的话题,比如并发和资源管理。 Diego Dagum的这篇好文章解释了C++11中关于并发性的新内容

还有一篇关于unique_ptr的文章:

这是一种危险的说法
const
仅在实现遵循某些规则时表示线程安全。就标准而言,
const
确实可以与线程安全性互换,但这并不意味着您不能滥用它。以向量的这个包装器为例,它是如何出错的一个愚蠢的例子:因此
const
可以用作线程安全性的指标,但不能作为保证。这与OPs关于“有互斥器就足够了”的想法是一样的。存在
const
是不够的。保护它。是的,我指的是STDLib或编码良好的const函数上的const。你总是可以做坏事。:)@stefan是否注意到const的哪些实现是线程安全的?@pyCthon None。一点也没有。标准库是为性能而构建的,因此线程安全性在这段代码中非常罕见。在其他人的代码中:检查和重复检查。如果有任何疑问,请使用您自己的互斥来保护它。如果开发人员没有明确地说“它是线程安全的”,而您对任何方法都不确定,那么您自己就让它成为线程安全的。通过添加
const
,您无法保证任何线程安全,即使它可能会编译。我同意在c++11之前没有线程安全,但由于使用STL容器可以保证在get函数期间容器本身不会更改。但是,大多数STL函数确实不是基于线程安全的。对于性能和线程安全,请查看PPL、TBB和boost的并发请求。这是一个危险的声明
const
仅在实现遵循某些规则时表示线程安全。就标准而言,
const
确实可以与线程安全性互换,但这并不意味着您不能滥用它。以向量的这个包装器为例,它是如何出错的一个愚蠢的例子:因此
const
可以用作线程安全性的指标,但不能作为保证。这与OPs关于“有互斥器就足够了”的想法是一样的。存在
const
是不够的。保护它。是的,我指的是STDLib或编码良好的const函数上的const。你总是可以做坏事。:)@stefan是否注意到const的哪些实现是线程安全的?@pyCthon None。一点也没有。标准库是为性能而构建的,因此线程安全性在这段代码中非常罕见。在其他人的代码中:检查和重复检查。如果有任何疑问,请使用您自己的互斥来保护它。如果开发人员没有明确地说“它是线程安全的”,而您对任何方法都不确定,那么您自己就让它成为线程安全的。通过添加
const
,您无法保证任何线程安全,即使它可能会编译。我同意在c++11之前没有线程安全,但由于使用STL容器可以保证在get函数期间容器本身不会更改。但是,大多数STL函数确实不是基于线程安全的。要获得性能和线程安全性,请查看PPL、TBB和boost的并发请求