失敗の可能性がある上から値をポップするための次の関数を使用して、ミューテックスで保護されたスタックを作成しています。
bool try_pop(T& value)
{
std::lock_guard<std::mutex> lock(mutex_);
if (ctr_.empty())
return false;
value = std::move(ctr_.back());
ctr_.pop_back();
return true;
}
std::vector
基になるコンテナーとしてa を使用しています。コピー不可能な T をスタックに格納するために (例: std::unique_ptr
) std::move
、ベクターの後ろから T を削除していました。そうしないと、コピーが作成されます。2 つの質問: a) これは正しいですか? T は移動またはコピーされますか? b) 例外の安全性が心配です。移動がスローされた場合、スタックはポップされませんが、トップ値は半分移動された状態になる可能性があります。これは可能ですか、どうすれば解決できますか?