名前空間
変種
操作

std::thread::thread

提供: cppreference.com
< cpp‎ | thread‎ | thread
 
 
スレッドサポートライブラリ
スレッド
(C++11)
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++11)
(C++11)
(C++11)
(C++11)
 
 
thread() noexcept;
(1) (C++11およびそれ以降)
thread( thread&& other ) noexcept;
(2) (C++11およびそれ以降)
template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );
(3) (C++11およびそれ以降)
thread(const thread&) = delete;
(4) (C++11およびそれ以降)

新しいスレッドオブジェクトを構築します。

1) スレッドを表さないスレッドオブジェクトを作成します。
2) ムーブコンストラクタ。 other によって表されていた実行のスレッドを表すスレッドオブジェクトを構築します。 呼び出しの後 other は実行のスレッドを表さなくなります。
3) 新しい std::thread オブジェクトを作成し、実行のスレッドと紐付けます。 新しい実行のスレッドは
std::invoke(decay_copy(std::forward<Function>(f)), decay_copy(std::forward<Args>(args))...);
を実行することによって開始されます。 ただし decay_copy は以下のように定義されます。
template <class T>
std::decay_t<T> decay_copy(T&& v) { return std::forward<T>(v); }
ただし、引数の評価中、コピー中、ムーブ中に投げられたあらゆる例外が新しいスレッドを開始せずにカレンドスレッド上で投げられるようにするため、 decay_copy の呼び出しは、呼び出し元の文脈で評価されます。
コンストラクタの呼び出しの完了は、新しい実行のスレッド上の f のコピーの呼び出しの開始に対して同期します (std::memory_order を参照してください)。
このコンストラクタは、 std::decay_t<Function>std::thread と同じ型の場合、オーバーロード解決に参加しません。
(C++14およびそれ以降)
4) コピーコンストラクタは削除されています。 スレッドはコピー可能ではありません。 2つの std::thread オブジェクトが同じ実行のスレッドを表すことはありません。

目次

[編集] 引数

other - このスレッドを構築するための別のスレッドオブジェクト
f - 新しいスレッドで実行する Callable オブジェクト
args... - 新しい関数に渡す引数

[編集] 事後条件

1) get_id()std::thread::id() と等しくなります (すなわち joinablefalse になります)
2) other.get_id()std::thread::id() と等しくなり、 get_id() は構築開始前の other.get_id() の値を返します
3) get_id()std::thread::id() と等しくなります (すなわち joinabletrue になります)

[編集] 例外

3) スレッドを開始できなかった場合は std::system_error。 この例外はエラーコンディション std::errc::resource_unavailable_try_again または処理系固有の別のエラーコンディションを表すかもしれません。

[編集] ノート

スレッド関数への引数はムーブまたはコピーによって値渡しされます。 スレッド関数に参照引数を渡す必要がある場合は、 (std::refstd::cref などで) ラップする必要があります。

関数からのあらゆる戻り値は無視されます。 関数が例外を投げた場合は std::terminate が呼ばれます。 呼び出し元スレッドに戻り値や例外を渡すには、 std::promisestd::async を使うことができます。

[編集]

#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
 
void f1(int n)
{
    for (int i = 0; i < 5; ++i) {
        std::cout << "Thread 1 executing\n";
        ++n;
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}
 
void f2(int& n)
{
    for (int i = 0; i < 5; ++i) {
        std::cout << "Thread 2 executing\n";
        ++n;
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
    }
}
 
int main()
{
    int n = 0;
    std::thread t1; // t1 is not a thread
    std::thread t2(f1, n + 1); // pass by value
    std::thread t3(f2, std::ref(n)); // pass by reference
    std::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a thread
    t2.join();
    t4.join();
    std::cout << "Final value of n is " << n << '\n';
}

出力例:

Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 1 executing
Thread 2 executing
Thread 2 executing
Thread 1 executing
Final value of n is 5

[編集] 参考文献

  • C++11 standard (ISO/IEC 14882:2011):
  • 30.3.1.2 thread constructors [thread.thread.constr]

[編集] 関連項目