4

レビューが必要な基本的なサンプルがあります (C++)。

関数 PublicFunc() と、PrivateFunc() という別の関数があるとします。それらを慎重に同期させたいと思います。しかし、PrivateFunc は、PublicFunc を呼び出すこともあります。これは、同じスレッドから呼び出していることを意味します。これがブロックの原因で、解決したいです。

mutable boost::mutex m;

void PublicFunc() {
 m.lock();
 //Here it blocks, but why?
 //What I need is to get the lock if this func was called from PrivateFunc(), so exactly from the same thread.
 //But! It should definitely block on calling PublicFunc from outside while we are for example in the 'OtherPrivateFunc'.

 //Do some stuff

 //this is not necessary
 m.unlock(); 
}

void PrivateFunc() {
 m.lock();

 PublicFunc();

 OtherPrivateFunc();

 m.unlock();
}

boost ライブラリのミューテックスまたはロックはどれですか? ありがとうございました!

4

1 に答える 1

4

Amutexは一度だけロックできます。ミューテックスのロックを保持しているスレッドがミューテックスをロックしようとした場合でも、ミューテックスがロックされている間にミューテックスをロックする呼び出しはブロックされます。

同じスレッドでミューテックスを複数回ロックできるようにする場合は、recursive_mutex.

または、ミューテックスがロックされていることを前提とする (プライベート) メンバー関数のセットを 1 つ持ち、他のすべての関数をこれらに委任するように、コードを再編成することを検討してください。これにより、コードがより明確になり、同期が正しいことを確認しやすくなります。

于 2012-07-07T21:54:00.550 に答える