名前空間
変種
操作

std::mutex::try_lock

From cppreference.com
< cpp‎ | thread‎ | mutex
 
 
並行性サポートライブラリ
スレッド
(C++11)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
協調的なキャンセル
排他制御
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
std::mutex
メンバ関数
ロック
mutex::try_lock
ネイティブハンドル
 
bool try_lock();
(C++11以降)

ミューテックスのロックを試みます。すぐに返します。ロックの取得に成功した場合は true を返し、それ以外の場合は false を返します。

この関数は、ミューテックスが現在他のスレッドによってロックされていなくても、偶発的に失敗して false を返すことがあります。

try_lock が、既に mutex を所有しているスレッドによって呼び出された場合、その動作は未定義です。

同じミューテックスに対する以前の unlock() 操作は、この操作が true を返す場合、std::memory_order で定義されるように synchronizes-with(同期します)します。以前の lock() は、この操作が false を返す場合、この操作とは同期しないことに注意してください。

目次

[編集] パラメータ

(なし)

[編集] 戻り値

ロックが正常に取得された場合は true、それ以外の場合は false

[編集] 例外

何もスローしません。

[編集]

#include <chrono>
#include <iostream> // std::cout
#include <mutex>
#include <thread>
 
std::chrono::milliseconds interval(100);
 
std::mutex mutex;
int job_shared = 0; // both threads can modify 'job_shared',
                    // mutex will protect this variable
 
int job_exclusive = 0; // only one thread can modify 'job_exclusive'
                       // no protection needed
 
// this thread can modify both 'job_shared' and 'job_exclusive'
void job_1() 
{
    std::this_thread::sleep_for(interval); // let 'job_2' take a lock
 
    while (true)
    {
        // try to lock mutex to modify 'job_shared'
        if (mutex.try_lock())
        {
            std::cout << "job shared (" << job_shared << ")\n";
            mutex.unlock();
            return;
        }
        else
        {
            // can't get lock to modify 'job_shared'
            // but there is some other work to do
            ++job_exclusive;
            std::cout << "job exclusive (" << job_exclusive << ")\n";
            std::this_thread::sleep_for(interval);
        }
    }
}
 
// this thread can modify only 'job_shared'
void job_2() 
{
    mutex.lock();
    std::this_thread::sleep_for(5 * interval);
    ++job_shared;
    mutex.unlock();
}
 
int main() 
{
    std::thread thread_1(job_1);
    std::thread thread_2(job_2);
 
    thread_1.join();
    thread_2.join();
}

実行結果の例

job exclusive (1)
job exclusive (2)
job exclusive (3)
job exclusive (4)
job shared (1)

[編集] 関連項目

ミューテックスをロックします。ミューテックスが利用できない場合はブロックします
(public メンバ関数) [編集]
ミューテックスをアンロックします
(public メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)