std::mutex
は、標準でそう書いているのでコピーできません。彼らはコピー可能なstd::mutex
を書いた可能性がありますが、そうでないと決めました。
コピー不可能なstd::mutex
は、より効率的で、安全で、わかりやすいかもしれません。
例として、より安全で理解しやすい理由は次のとおりです。std::mutex
がロックされているとはどういう意味ですか?個人的には、正しい答えが何であるか分かりません。私は正解が "それはナンセンス"だと思う。 「少なくとも驚きの答え」はありません。
並行処理コードで驚くべき回答をする代わりに、コピーをブロックすることで質問を回避します。コピーしたいミューテックスを格納している人は、自分が望むものを自分で決める必要があります。
C++では、コピーコンストラクタが自動的に生成されることがあります。より多くの状況では、それはあなたがそれを求めるときにMyClass(MyClass const&)=default
と1つを書くことができます。
クラスにコピー不可能なクラスが含まれている場合、クラスにはコピーできません。生成できません。そのクラスは要求できません。これは、生成されたコピーコンストラクタが基本的にメンバーをコピーするためです。メンバをコピーできない場合は、コピーコンストラクタを生成できません。
したがってmutex
は標準でそう言いますからコピーできません。
構造体またはクラスにコピーできないメンバーが含まれている場合、デフォルトのコピーコンストラクタは使用できません。自分自身を明示的に書く必要があります。
あなたのタイプは、そのほかのメンバーの手動コピーがすべてのサブ構造体にあなたの非mutex
状態を固執することですコピーctorのを維持することの頭痛を防ぐためにmutex
、1つのアプローチを保存する必要がある場合その既定のコピーを使用します。次に、コピー中にmutex
をどうすればよいかを決定し、コピーctor(および代入コピー演算子)は単純なままです。
struct bob_with_mutex {
sturct bob_simple_data {
int x, y, z;
std::vector<char> buff;
};
bob_simple_data data;
std::mutex m;
bob_with_mutex(bob_with_mutex const& o):
data(o.data)
{}
bob_with_mutex& operator=(bob_with_mutex const& o)
{
data = o.data;
return *this;
}
};
タイプbob
には、ミューテックスといくつかのデータが混在しています。データはサブ構造に格納されます。 bob_with_mutex
のコピーctorはデフォルトにすることはできませんが、単に "データをコピーするだけです"と表示されます。
bob
のコピーには独自のミューテックスがあります。
「なぜstd :: mutexはコピー不可能なのですか」、または「コピー不可能なメンバを追加するとクラスをコピー不可能にするのはなぜですか」という疑問ですか? – Barry
Barry、両方の質問の答えを得る –
'mutex'を含む型のコピーとメンバの移動方法:http://stackoverflow.com/a/29988626/576911 –