cppreferenceによるstd::lock_guard
と、std::mutex
パラメータを使用して を構築すると、その のlock()
メソッドが呼び出されmutex
ます。
cplusplusによると、mutex
のメソッドに関してlock()
:
ミューテックスが別のスレッドによってロックされている場合、呼び出し元のスレッドの実行は、別のスレッドによってロックが解除されるまでブロックされます...
タイトルの質問が適切に表現されているかどうかわからないので、以下のコードのコンテキストに入れました。
これをテストして、呼び出し可能なスレッド (関数、ファンクター、ラムダなど) の実行を終了したり、例外をスローしたりするのではなく、呼び出し元のスレッドが実際にロック解除を待機するかどうかを確認したかったのです。次のコードには 2 つのスレッドt1
とがありt2
、それぞれが同じ関数へのポインタで構築されていますfoo
。への各呼び出しは、ロックで保護されたコードを実行する前に、のparameterによって決定さfoo
れるsleep_for
一定の時間になります。ロックで保護されたコード自体には、ブロックされた実行期間をより明確にするために、別の期間が含まれています。foo
unsigned
num
sleep_for
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
std::mutex m;
void foo(unsigned num) {
std::this_thread::sleep_for(std::chrono::milliseconds(num * 10));
std::lock_guard<std::mutex> guard(m);
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
std::cout << num << std::endl;
}
int main() {
std::thread t1(foo, 10);
std::thread t2(foo, 5);
t1.join();
t2.join();
}
コンソール出力:
5
10
が出力されるまでに約/少なくとも 3.05 秒かかり5
ます。が出力されるまでに約/少なくともさらに 3 秒かかり10
ます。これはt2
、保護されたコードを最初に実行することを意味しmutex
ます。
foo
from threadへの呼び出しt1
がlock_guard
行に到達し、mutex
によって既にロックされていることが判明すると、実行を終了したり、例外をスローしたりしないと想定しています。ロックが解除されるのを待つだけです。t2
t1
t1
どのくらいの頻度でロック解除をチェックしますかstd::mutex::lock()
? std::lock_guard
小切手はどのくらいの費用がかかりますか? チェックは次のように実装されていますか?
while (some_mutex.try_lock() == false) {
std::this_thread::sleep_for(std::chrono::milliseconds(1))
}
// execute lock-protected code