ハードウェアの周りでプロセス間同期が必要です。このコードは Windows と Linux で動作する必要があるため、Boost Interprocess ミューテックスでラップしています。すべてがうまく機能し、ミューテックスの放棄をチェックするための私の方法を受け入れます。こうなる可能性はあるので、それに備えなければなりません。
私はテストでミューテックスを放棄しました。確かに、scoped_lock を使用してミューテックスをロックすると、プロセスが無期限にブロックされます。これを回避する方法は、scoped_lock でタイムアウト メカニズムを使用することであると考えました (これを説明するメソッドをグーグルで検索するのに多くの時間が費やされたため、移植性の理由から、boost はこれをあまり処理しません)。
さらに苦労することなく、ここに私が持っているものがあります:
#include <boost/interprocess/sync/named_recursive_mutex.hpp>
#include <boost/interprocess/sync/scoped_lock.hpp>
typedef boost::interprocess::named_recursive_mutex MyMutex;
typedef boost::interprocess::scoped_lock<MyMutex> ScopedLock;
MyMutex* pGate = new MyMutex(boost::interprocess::open_or_create, "MutexName");
{
// ScopedLock lock(*pGate); // this blocks indefinitely
boost::posix_time::ptime timeout(boost::posix_time::microsec_clock::local_time() + boost::posix_time::seconds(10));
ScopedLock lock(*pGate, timeout); // a 10 second timeout that returns immediately if the mutex is abandoned ?????
if(!lock.owns()) {
delete pGate;
boost::interprocess::named_recursive_mutex::remove("MutexName");
pGate = new MyMutex(boost::interprocess::open_or_create, "MutexName");
}
}
少なくとも、それがアイデアです。3 つの興味深い点:
- タイムアウト オブジェクトを使用せず、mutex を破棄すると、ScopedLock ctor が無期限にブロックされます。それは予想されます。
- タイムアウトを使用し、mutex が放棄されると、ScopedLock ctor はすぐに戻り、mutex を所有していないことを通知します。わかりました、おそらくそれは正常ですが、私が言っている10秒も待っていないのはなぜですか?
- ミューテックスが放棄されず、タイムアウトを使用すると、ScopedLock ctor はすぐに返され、ミューテックスをロックまたは所有権を取得できなかったことを伝え、ミューテックスを削除して再作成する動作を実行します。 . これは私が望むものではありません。
では、これらのオブジェクトを使用する際に何が欠けているのでしょうか? じっと見つめているのかもしれませんが、見えないので助けを求めています。
また、このハードウェアのしくみにより、プロセスが 10 秒以内にミューテックスの所有権を取得できない場合、ミューテックスは破棄されることにも言及する必要があります。実際、おそらく 50 ミリ秒または 60 ミリ秒ほど待つこともできますが、10 秒は寛大さの「ラウンド」数としては適切です。
Visual Studio 2010 を使用して Windows 7 でコンパイルしています。
ありがとう、アンディ