私はこのようなコンストラクタでコンテナを提供し、ユーザーに基づいていますConcurrentQueue
クラス...イニシャライザのリストにミューテックスをロックする方法はありますか?
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.m_Queue) {}
を持っている。しかし、私はそれがコピーされている間other
のミューテックスをロックする必要があります。
オプション1:
だから私はすべてでコピーコンストラクタを使用して、行うことができませんでした...
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.m_Queue)
{
std::lock_guard<std::mutex> lock(other.m_Mutex);
m_Queue = other.m_Queue;
}
しかし、私はそのコピーの割り当てを保証し、建設をコピーすることはできませんが等価です機能性。
オプション2:
私はプライベートメソッドを持つことができ...
std::queue<T, Container> GetQueue() const
{
std::lock_guard<std::mutex> lock(other.m_Mutex);
return m_Queue;
}
そしてコンストラクタでこれを行う...
ConcurrentQueue(const ConcurrentQueue& other) : m_Queue(other.GetQueue()) {}
しかし、この潜在的に(最適化に依存します)は、m_Queueのコピーコンストラクタを一度使用し、そのコンストラクタを一度使用します。また、コピーと移動が単なるコピーと同等であることを保証することはできません。さらに、ユーザが提供するコンテナは、奇妙でコピー可能であるが移動不能である可能性があり、このアプローチにも問題が生じる可能性がある。
どうすればいいですか?
いつもそうするべきだと思いますか? – 0x499602D2
@ 0x499602D2実際、私はその状況を避けるべきだと思います。私はあなたの実際の文脈や解決しようとしている問題を他の解決法を提案するのには十分に分かっていませんが、実際にこのようなものを実際に使う必要はなかったことは分かっています。実際には、スレッド間でコンテナをコピーしたケースは考えられません。 –