、私はboost::mutex
のベクトル、制御インスタンスが所有する各1(奇妙なコード設計が、MWEの目的のみのために)lock
したいと思います。ブースト:: scoped_lockのRAIIの挙動
// std::vector<Controlled*> _vData;
void Container::main_method()
{
for (int i=0; i<_vData.size(); i++)
{
boost::mutex::scoped_lock my_lock(_vData.at(i)->_mutex);
this->processing(i);
}
// precondition for post_processing(): all processing() calls done
for (int i=0; i<_vData.size(); i++)
{
boost::mutex::scoped_lock my_lock(_vData.at(i)->_mutex);
this->post_processing(i);
}
}
しかしprocessing
ので、CPUバウンドとオブジェクトが他の場所での平均時間内から変更されている制御されて、私は単にをロックするために、main_method
の先頭に循環scoped_lock
をしたいと思いますこのよう
void Container::desired_main_method()
{
for (int i=0; i<_vData.size(); i++)
{
boost::mutex::scoped_lock my_lock(_vData.at(i)->_mutex);
}
// locks destroyed here, aren't they ?
for (int i=0; i<_vData.size(); i++)
{
this->processing(i);
}
for (int i=0; i<_vData.size(); i++)
{
this->post_processing(i);
}
}
など、すべてとできるだけ早く、私はよくRAIIイディオムとscoped_lock
コンテキストをunderstanded場合は、問題は、トンでありますこのようにして、ロックはロックが完了した直後に範囲外に出るでしょう。for
サイクルが終了します。
私はコンテナ CTORでnew
ロックの配列にしようとしたとdelete
にはそれにそのデストラクタで、私はこれはRAIIイディオム自体に反していると思います。
私は何を誤解したのですか、それともどのように問題全体をリファクタリングできますか?
なぜあなた自身で記述しますか?標準ライブラリには( 'std :: lock'と' defer_lock_t'を取り囲む)多くの機能があります。 Boostはiterator-rangeインターフェース(私の答えを見てください)を使うとさらに強力になります。あなたの実装が自然にデッドロックを起こしやすいので、もっと頑強になることに注意してください。 – sehe
@sehe:公正なポイント - 私の答えは、OPに "複数のロックガード"問題をどのように解決できるかを示すことを目的としています同様の問題と、独自のRAIIラッパーの実装方法を示しています。 –