std::shared_timed_mutex::lock
From cppreference.com
< cpp | thread | shared timed mutex
| void lock(); |
(C++14以降) | |
ミューテックスをロックします。別のスレッドが既にミューテックスをロックしている場合、lock の呼び出しはロックが取得されるまで実行をブロックします。
すでに共有モードまたは排他モードでmutexを所有しているスレッドがlockを呼び出した場合、動作は未定義です。
同じmutexに対する以前の unlock() 操作は、この操作と同期します(std::memory_order で定義されているように)。
目次 |
[編集] Parameters
(なし)
[編集] Return value
(なし)
[編集] Exceptions
エラーが発生した場合、および lock がその仕様を満たすのを妨げる基盤となるオペレーティングシステムからのエラーを含め、std::system_error をスローします。例外がスローされた場合、ミューテックスはロックされません。
[編集] Notes
lock() は通常直接呼び出されません。排他的ロックを管理するには、std::unique_lock、std::scoped_lock、および std::lock_guard が使用されます。
共有mutexは、共有所有権モードから排他所有権モードへの直接の移行をサポートしていません。排他所有権をlock()で取得する前に、共有ロックを unlock_shared() で解放する必要があります。この目的にはboost::upgrade_mutexを使用できます。
[編集] Example
この例では、共有データを保護するために lock と unlock がどのように使用できるかを示しています。
このコードを実行
#include <chrono> #include <iostream> #include <mutex> #include <thread> int g_num = 0; // protected by g_num_mutex std::mutex g_num_mutex; void slow_increment(int id) { for (int i = 0; i < 3; ++i) { g_num_mutex.lock(); ++g_num; // note, that the mutex also syncronizes the output std::cout << "id: " << id << ", g_num: " << g_num << '\n'; g_num_mutex.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(234)); } } int main() { std::thread t1{slow_increment, 0}; std::thread t2{slow_increment, 1}; t1.join(); t2.join(); }
実行結果の例
id: 0, g_num: 1 id: 1, g_num: 2 id: 1, g_num: 3 id: 0, g_num: 4 id: 0, g_num: 5 id: 1, g_num: 6
[編集] See also
| ミューテックスをロックしようとします。ミューテックスが利用できない場合は戻ります (public メンバ関数) | |
| ミューテックスをアンロックします (public メンバ関数) | |
| C documentation for mtx_lock
| |