2017-03-13 10 views
1

この質問はすべてmutexのドキュメントに書かれています。私は単一の関数を扱っています。C++:複数の関数が同時に実行されないようにする

私の質問は、次のコードは、並行して複数回実行されることからfunc1()またはfunc2()を防ぐことができますだけでなく、かどうか、それは同時に実行されてからfunc1()func2()を妨げるかどうか?私は多くの人々を理解したよう

#include <mutex> 

std::mutex my_mutex; 

void func1() { 
    my_mutex.lock(); 
    // do something ... 
    my_mutex.unlock(); 
} 

void func2() { 
    my_mutex.lock(); 
    // do something ... 
    my_mutex.unlock(); 
} 

は通常、私はAl_Bundyの入力@追加した後、私のサンプルコードの別のバージョンを追加してい、stackoverflowのからコードをコピー - 機能は、このように終了したときに破壊されて使用してlock_guardは、必ずあなたのミューテックスを作ります機能が終了してガードが破壊されたときに解放されます。

#include <mutex> 

std::mutex my_mutex; 

void func1() { 
    std::lock_guard<std::mutex> locker(my_mutex); 
    // do something ... 
} 

void func2() { 
    std::lock_guard<std::mutex> locker(my_mutex); 
    // do something ... 
} 
同じミューテックスがロックされているよう
+1

[std :: lock_guard](http://en.cppreference.com/w/cpp/thread/lock_guard)を使用しないのはなぜですか? –

+0

非常に良い入力のようです - 正しく理解すれば、関数が終了するとlock_guardがmutexのロックを解除します。手動でロック解除するよりはるかに安全です – SomethingSomething

+1

はい、正確です。私は**それを使用します**。 –

答えて

2

両方の関数が同じミューテックスをロックしているため、たいていのうちの1つはいつでも実行できます。

ミューテックスは機能などを全く気にしません。ミューテックス自体はロックされているかロック解除されています。すでにロックされている間にロックしようとすると、mutexがロック解除されるまでブロックされます。あなたは1つのミューテックスを扱っているので、my_mutex.lock()コードのどこかでロックされるとすぐにmy_mutex.lock()を呼び出すと、my_mutex.unlock()が呼び出されるまでブロックされます。

lock()コール内でブロックされているスレッドのうちの1つがであれば、ブロック解除され、ミューテックスを取得(=ロック)して処理を進めます。他はブロックされたままです。

2

はい、限り、それができる:それはあなたの関数が例外を取得し、可能性として、あなたが代わりに手動ロックガードを使用してのロックを解除するとき、あなたのミューテックスがロックされたままでした、はるかに安全ですロックが解除されるまで他の場所からロックされることはありません。

1

はい、ほとんどの場合、これは該当します。しかし、mutexesにはtheadの所有者があることに注意してください。 同じスレッドであれば、lock()はミューテックスが解放されるのを待たないでしょう。

関連する問題