私は複数のスレッドで作成できるクラスを持っています。しかし、ある関数ではコードを保護する必要があるので、私はboostプロセス間のmutexを使うことに決めました。すべてのクラスは、それのコンストラクタで同じミューテックスを作成するか、開きます。ブーストnamed_mutexとremove()コマンド
int MyClass::MyFunction()
{
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(
m_Lock, boost::interprocess::try_to_lock);
if(!lock)
{
return -1;
}
// else do some stuff here
}
その関数の後にクリーンアップ(と好きに:
MyClass::MyClass()
{
boost::interprocess::named_mutex m_Lock(
boost::interprocess::open_or_create, "myLock");
}
だから今、重要なコード部分が呼び出されるポイントが来ます実際には、すべてこのコードは、正常に動作し
MyClass::~MyClass()
{
boost::interprocess::named_mutex::remove("myLock");
}
が、私は持っている1つの懸念がある:
0私は私のクラスのデストラクタでremoveコマンドを使用します)ブーストページに記載は、システムからの名前のミューテックスを消去します:それはremoveコマンドの説明で言われたよう
。エラー時にはfalseを返します。スローしないでください。
これは、システムからMutexを削除するだけで、別のスレッドがロックしたとしても(既にこのケースを試しましたが、もうロックされていない)、削除されます。 だから私の問題は、以下の通りである。たとえば 私は3つのスレッド(A、BおよびC)を持っている - 今、次の処理が行われます。Aは、クラスのインスタンスを作成する関数を呼び出し、それををロック
- プロセスを
- プロセスBは、クラスのインスタンスを作成する関数を呼び出すが、コードにアクセスすることができない(次に待ちなど)
- プロセスAは、保護されたコードで終了し、それが保護されたコードへ
- プロセスBゲインのアクセスをロック解除されますそれをロックする
- Proces ■クラスのインスタンスを削除します。 - > removeコマンドが呼び出されます。
- プロセスCは、クラスのインスタンスを作成し、関数を呼び出し、削除コマンドがMutex - >エラーを消去したためコードにアクセスできます。
だから、誰かが「次に削除しないでください!」と言うかもしれません。私はnamed_mutexがシステムに書き込むので、たとえプログラムが終了しても明示的な呼び出しがなければ消去されるのではないかと疑う。 誰かに助けがありますか?
あなたの質問と「スレッド」と「プロセス」という用語の使い分けが混乱します。あなたはどちらを扱っていますか?スレッド?またはプロセス?あなたが単一のプロセス内でマルチスレッド化されているのであれば、名前付きの変異体は一般的に非常に限界的な有用性を持っています。 –
それについて申し訳ありません - 私はちょうど書いている間、ちょっと混乱しています。実際に私は別のプロセスを持っています。あなたが言ったように、スレッドだけでは、名前付きmutexの実際の必要はありません。 – Toby