0

cppreferenceによるstd::lock_guardと、std::mutexパラメータを使用して を構築すると、その のlock()メソッドが呼び出されmutexます。

cplusplusによると、mutexのメソッドに関してlock():

ミューテックスが別のスレッドによってロックされている場合、呼び出し元のスレッドの実行は、別のスレッドによってロックが解除されるまでブロックされます...

タイトルの質問が適切に表現されているかどうかわからないので、以下のコードのコンテキストに入れました。

これをテストして、呼び出し可能なスレッド (関数、ファンクター、ラムダなど) の実行を終了したり、例外をスローしたりするのではなく、呼び出し元のスレッドが実際にロック解除を待機するかどうかを確認したかったのです。次のコードには 2 つのスレッドt1とがありt2、それぞれが同じ関数へのポインタで構築されていますfoo。への各呼び出しは、ロックで保護されたコードを実行する前に、のparameterによって決定さfooれるsleep_for一定の時間になります。ロックで保護されたコード自体には、ブロックされた実行期間をより明確にするために、別の期間が含まれています。foounsignednumsleep_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ます。

foofrom threadへの呼び出しt1lock_guard行に到達し、mutexによって既にロックされていることが判明すると、実行を終了したり、例外をスローしたりしないと想定しています。ロックが解除されるのを待つだけです。t2t1t1

どのくらいの頻度でロック解除をチェックしますか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
4

2 に答える 2

4

std::mutex::lock() または std::lock_guard はどのくらいの頻度でロック解除をチェックしますか?

そうではありません。リソースが解放されるまで、オペレーティング システム内でブロックされます。回転によってこれを実装したオペレーティング システムは、苦情の原因となります。

于 2014-01-10T02:00:40.190 に答える