「std::unique lock」の版間の差分
提供: C++入門
(ページの作成:「std::unique_lock とは、C++のmutexの処理を書くときに、コンストラクトデストラクタで確実にロックとアンロックを行うための...」) |
|||
行67: | 行67: | ||
1388312730 | 1388312730 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | == 複数のmutexをロックする == | ||
+ | [[std::lock]]をご参照ください。 | ||
== 関連項目 == | == 関連項目 == | ||
* [[std::lock]] | * [[std::lock]] |
2013年12月29日 (日) 21:48時点における版
std::unique_lock とは、C++のmutexの処理を書くときに、コンストラクトデストラクタで確実にロックとアンロックを行うためのクラスです。
読み方
- std::unique_lock
- えすてぃーでぃー ゆにーく ろっく
目次
概要
std::unique_lockは、タイムアウト付きのロックを試行できます。 std::lock_guardとの違いは、以下の通りです。
- コンストラクタでは、ロックせずに、あとからロックを取得します(defer lock)。
- 今ストラクでロックの取得に、lock()ではなく try_lock()を使用できます。
- mutexの所有権を移動・交換(swap)と放棄(release)ができます。
- 任意のタイミングで、所有 mutex の lock 操作を呼び出せます。
タイムアウト付きのロックの例
ソースコード std_mutex_unique_lock1.cpp
#include <iostream> #include <thread> #include <exception> #include <mutex> #include <vector> #include <ctime> using namespace std; std::timed_mutex m; std::vector<time_t> v; void do_worker1 () { std::cout << __PRETTY_FUNCTION__ << std::endl; std::unique_lock<std::timed_mutex> ul(m, std::chrono::milliseconds(3) ); // wait upt to 3ms if (ul) { // If I got the lock, access data. v.push_back(time(NULL)); } // mutex unlocked ! } int main (int argc, char *argv[]) { try { std::thread t1(do_worker1); std::thread t2(do_worker1); t1.join(); t2.join(); for(auto t:v) { cout << t << endl; } } catch (std::exception &ex) { std::cerr << ex.what() << std::endl; } return (0); }
コンパイル
g++49 -std=c++11 -I/usr/local/lib/gcc49/include/c++/ \ -Wl,-rpath=/usr/local/lib/gcc49 -pthread std_mutex_unique_lock1.cpp -o std_mutex_unique_lock1
実行例
% ./std_mutex_unique_lock1 void do_worker1() void do_worker1() 1388312730 1388312730
複数のmutexをロックする
std::lockをご参照ください。
関連項目
mutexの種類 | 説明 |
---|---|
std::mutex | 非再帰的mutex |
std::recursive_mutex | 再帰的mutext |
std::timed_mutex | ロック関数でタイムアウトが可能な非再帰的mutex |
std::recursive_timed_mutex | ロック関数でタイムアウトが可能な再帰的mutex |
ロッククラステンプレート
- std::unique_lock<>
- std::lock_guard<>
関数 | 説明 |
---|---|
メンバ関数 | |
std::thread::thread | コンストラクタ。threadオブジェクトを作成します。 |
std::thread::~thread | スレッドがjoinかdetachされている必要があります。スレッドオブジェクトを破棄します。 |
std::thread::operator= | スレッドオブジェクトをmoveします。 |
オブザーバー | |
std::thread::joinable | スレッドが合流可能であるかチェックします。 |
std::thread::get_id | スレッドのIDを返します。 |
std::thread::native_handle | スレッドハンドルを返します。 |
std::thread::hardware_concurrency | 実装によってサポートされる同時スレッド数を返します。 |
操作 | |
std::thread::join | スレッドの終了を待ちます。 |
std::thread::detach | スレッドハンドルから独立して実行するスレッドを許可します。 |
std::thread::swap | スワップ |
非メンバ関数 | |
std::swap | スワップ |
カレントスレッドの管理 | |
std::this_thread::yield_id | 処理系に再スケジュールの機会を与えます。 |
std::this_thread::get_id | スレッドIDを返します。 |
std::this_thread::sleep_for | 指定した時間、現在のスレッドの実行を停止します。 |
std::this_thread::sleep_until | 指定した時刻まで、現在のスレッドの実行を停止します。 |