名前空間
変種
操作

std::mutex::try_lock

提供: cppreference.com
< cpp‎ | thread‎ | mutex
 
 
スレッドサポートライブラリ
スレッド
(C++11)
(C++20)
(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++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
フューチャー
(C++11)
(C++11)
(C++11)
(C++11)
 
std::mutex
メンバ関数
ロック
mutex::try_lock
ネイティブハンドル
 
bool try_lock();
(C++11以上)

ミューテックスのロックを試みます。 すぐに戻ります。 ロックの取得に成功した場合は true を返し、そうでなければ false を返します。

この関数は、ミューテックスが現在いかなる他のスレッドにもロックされていなくても、 spurious に失敗して false を返すことが認められています。

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

true を返した場合、同じミューテックスに対する以前の unlock() 操作は、この操作に対して同期します (std::memory_order を参照してください)。 false を返した場合は同期されないことに注意してください。

目次

[編集] 引数

(なし)

[編集] 戻り値

ロックの取得に成功した場合は true、そうでなければ false

[編集] 例外

(なし)

[編集]

#include <chrono>
#include <mutex>
#include <thread>
#include <iostream> // std::cout
 
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)

[編集] 関連項目

ミューテックスをロックします。 利用可能でない場合はブロックします
(パブリックメンバ関数) [edit]
ミューテックスのロックを解除します
(パブリックメンバ関数) [edit]