nlib
nn::nlib::threading 名前空間

スレッド関連のクラスや関数が実装されています。 [詳解]

名前空間

 this_thread
 カレントスレッドの動作に関係する関数が実装されています。
 

クラス

struct  AdoptLockType
 タグ用の型でScopedLockUniqueLockにおいて利用されます。 [詳解]
 
class  AsyncFileIo
 非同期ファイルI/Oをラップしたクラスです。 [詳解]
 
class  AsyncFileIoService
 非同期ファイルI/Oを管理するためのクラスです。 [詳解]
 
class  Barrier
 任意の数のスレッドを同期するために使用します。 [詳解]
 
class  CondVar
 同期処理を行うための条件変数です。 [詳解]
 
class  CondVarForSharedCriticalSection
 SharedCriticalSection, nlib_rwlock用の条件変数です。CondVarと同様に使うことができます。 [詳解]
 
class  CriticalSection
 リエントラントなミューテックスです。 [詳解]
 
struct  DeferLockType
 タグ用の型でScopedLockUniqueLockにおいて利用されます。 [詳解]
 
class  Future
 別のスレッド実行の出力をスレッドセーフに取得するためのクラスです。C++11のstd::shared_futureに似ています。 [詳解]
 
class  LockFreeThreadPool
 細粒度のタスクを投入するのに向いたスレッドプールです。 [詳解]
 
class  PackagedTask
 関数をラップし、別スレッドで実行し戻り値をスレッドセーフに取得できるようにするクラスです。C++11のstd::packaged_taskに似ています。 [詳解]
 
class  Promise
 スレッド実行の結果を呼び出しスレッドに対してスレッドセーフに出力するためのクラスです。C++11のstd::promiseに似ています。 [詳解]
 
class  ScopedLock
 CriticalSection等をラップしてコンストラクタでロック、デストラクタでアンロックします。 [詳解]
 
class  Semaphore
 セマフォを実装しています。 [詳解]
 
class  SharedCriticalSection
 リードライトロックを実装しています。複数のスレッドが同時にデータを読み、単一のスレッドがデータを書きこむ場合に利用します。 [詳解]
 
class  SimpleCriticalSection
 最も単純なクリティカルセクションです。リエントラントではありません。 [詳解]
 
class  Thread
 スレッドの生成・開始を行うためのクラスです。 [詳解]
 
struct  ThreadArg
 Threadクラスでスレッドを実行するために利用できる構造体です。 [詳解]
 
class  ThreadPool
 予めプールされた作成済みのスレッドに対してタスクを投入することができます。 [詳解]
 
struct  ThreadSettings
 nlib_thread_attrをラップするクラスです。必要に応じて自動的にnlib_thread_attr_init()nlib_thread_attr_destroy()が実行されます。 [詳解]
 
class  TimedCriticalSection
 リエントラントでタイムアウトが可能なクリティカルセクションです。 [詳解]
 
class  Tls
 スレッドローカルストレージを扱うためのクラスです。 [詳解]
 
struct  TryToLockType
 タグ用の型でScopedLockUniqueLockにおいて利用されます。 [詳解]
 
class  UniqueLock
 CriticalSection等をラップするためのクラスです。 [詳解]
 
class  WhenFutureComplete
 Futureに値が設定されたことを条件として値が設定されるFutureを定義します。 [詳解]
 

関数

template<class FutureResult >
errno_t GetFutureError (FutureResult &result) noexcept
 スレッドがエラー値を持つとき、それをシステムが取得できるようにするための関数です。 [詳解]
 
template<class R >
errno_t MakeReadyFuture (Future< R > *future, const R &value)
 予め値が設定されたFutureを作成します。 [詳解]
 
size_t GetHardwareConcurrency () noexcept
 ハードウェアスレッドの数を返します。 [詳解]
 
Async(引数を持たない関数)
template<class FUNC , class R >
errno_t Async (Future< R > *future, const FUNC &func, const ThreadSettings &settings)
 ユーザーがスレッドの起動設定を行うことができるAsyncです。
 
template<class FUNC , class R >
errno_t Async (Future< R > *future, const FUNC &func, const ThreadSettings &settings, move_tag)
 ユーザーがスレッドの起動設定と行うことができ、引数や関数オブジェクトがムーブされるAsyncです。
 
template<class FUNC , class R >
errno_t Async (Future< R > *future, const FUNC &func)
 関数を別スレッドで実行して実行結果をFutureで取り出せるようにします。
 
template<class FUNC , class R >
errno_t Async (Future< R > *future, const FUNC &func, move_tag)
 引数や関数オブジェクトがムーブされるAsyncです。
 
Async(引数が1つの関数)
template<class FUNC , class R , class T1 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const ThreadSettings &settings)
 ユーザーがスレッドの起動設定を行うことができるAsyncです。
 
template<class FUNC , class R , class T1 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const ThreadSettings &settings, move_tag)
 ユーザーがスレッドの起動設定と行うことができ、引数や関数オブジェクトがムーブされるAsyncです。
 
template<class FUNC , class R , class T1 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1)
 関数を別スレッドで実行して実行結果をFutureで取り出せるようにします。 [詳解]
 
template<class FUNC , class R , class T1 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, move_tag)
 引数や関数オブジェクトがムーブされるAsyncです。 [詳解]
 
Async(引数が2つの関数)
template<class FUNC , class R , class T1 , class T2 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const ThreadSettings &settings)
 ユーザーがスレッドの起動設定を行うことができるAsyncです。
 
template<class FUNC , class R , class T1 , class T2 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const ThreadSettings &settings, move_tag)
 ユーザーがスレッドの起動設定と行うことができ、引数や関数オブジェクトがムーブされるAsyncです。
 
template<class FUNC , class R , class T1 , class T2 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2)
 関数を別スレッドで実行して実行結果をフューチャーによって取り出せるようにします。 [詳解]
 
template<class FUNC , class R , class T1 , class T2 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, move_tag)
 引数や関数オブジェクトがムーブされるAsyncです。
 
Async(引数が3つの関数)
template<class FUNC , class R , class T1 , class T2 , class T3 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, const ThreadSettings &settings)
 ユーザーがスレッドの起動設定を行うことができるAsyncです。
 
template<class FUNC , class R , class T1 , class T2 , class T3 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, const ThreadSettings &settings, move_tag)
 ユーザーがスレッドの起動設定と行うことができ、引数や関数オブジェクトがムーブされるAsyncです。
 
template<class FUNC , class R , class T1 , class T2 , class T3 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3)
 関数を別スレッドで実行して実行結果をフューチャーによって取り出せるようにします。 [詳解]
 
template<class FUNC , class R , class T1 , class T2 , class T3 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, move_tag)
 引数や関数オブジェクトがムーブされるAsyncです。
 
Async(引数が4つの関数)
template<class FUNC , class R , class T1 , class T2 , class T3 , class T4 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, const ThreadSettings &settings)
 ユーザーがスレッドの起動設定を行うことができるAsyncです。
 
template<class FUNC , class R , class T1 , class T2 , class T3 , class T4 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, const ThreadSettings &settings, move_tag)
 ユーザーがスレッドの起動設定と行うことができ、引数や関数オブジェクトがムーブされるAsyncです。
 
template<class FUNC , class R , class T1 , class T2 , class T3 , class T4 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4)
 関数を別スレッドで実行して実行結果をフューチャーによって取り出せるようにします。 [詳解]
 
template<class FUNC , class R , class T1 , class T2 , class T3 , class T4 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, move_tag)
 引数や関数オブジェクトがムーブされるAsyncです。
 
Async(引数が5つの関数)
template<class FUNC , class R , class T1 , class T2 , class T3 , class T4 , class T5 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, const T5 &arg5, const ThreadSettings &settings)
 ユーザーがスレッドの起動設定を行うことができるAsyncです。
 
template<class FUNC , class R , class T1 , class T2 , class T3 , class T4 , class T5 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, const T5 &arg5, const ThreadSettings &settings, move_tag)
 ユーザーがスレッドの起動設定と行うことができ、引数や関数オブジェクトがムーブされるAsyncです。
 
template<class FUNC , class R , class T1 , class T2 , class T3 , class T4 , class T5 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, const T5 &arg5)
 関数を別スレッドで実行して実行結果をフューチャーによって取り出せるようにします。 [詳解]
 
template<class FUNC , class R , class T1 , class T2 , class T3 , class T4 , class T5 >
errno_t Async (Future< R > *future, const FUNC &func, const T1 &arg1, const T2 &arg2, const T3 &arg3, const T4 &arg4, const T5 &arg5, move_tag)
 引数や関数オブジェクトがムーブされるAsyncです。
 

変数

constexpr const AdoptLockType adoptLock = {}
 AdoptLockType 型の値です。
 
constexpr const TryToLockType tryToLock = {}
 TryToLockType 型の値です。
 
constexpr const DeferLockType deferLock = {}
 DeferLockType 型の値です。
 

詳解

スレッド関連のクラスや関数が実装されています。

説明
nn::nlib::threading名前空間には以下のようなクラスや関数が実装されています。

関数詳解

§ Async() [1/6]

template<class FUNC , class R , class T1 >
nn::nlib::threading::Async ( Future< R > *  future,
const FUNC &  func,
const T1 &  arg1 
)
inline

関数を別スレッドで実行して実行結果をFutureで取り出せるようにします。

テンプレート引数
Rfunc の戻り値の型
FUNCfunc の型
T1func に渡す引数
引数
[in]futureFuture<R> へのポインタ
[in]func1引数を取る関数や関数オブジェクト
[in]arg1関数に渡す引数
戻り値
0スレッドの実行が開始された場合
EINVALfuture 又は funcNULLだった場合
ENOMEM内部でメモリの確保に失敗した場合
説明
C++11標準ライブラリのstd::asyncに類似しています。 最後の引数でThreadSettingsを設定できるバージョンも実装されています。
以下のようなコードで関数を別スレッドで実行して、結果をFutureで受け取ることができます。
int Plus1(int arg1) { return arg1 + 1; }
....
Future<int> myfuture;
errno_t e = Async(&myfuture, Plus1, 1);
if (e != 0) { エラー }
int result = myfuture.Get(); // 2
なお、末尾にnn::nlib::move_tag()を引数として付け加えることにより、引数がムーブ(swapメンバ関数での実装)され、オブジェクトのコピーを削減することができます。

Future.h1534 行目に定義があります。

§ Async() [2/6]

template<class FUNC , class R , class T1 >
nn::nlib::threading::Async ( Future< R > *  future,
const FUNC &  func,
const T1 &  arg1,
move_tag   
)
inline

引数や関数オブジェクトがムーブされるAsyncです。

テンプレート引数
Rfunc の戻り値の型
FUNCfunc の型
T1func に渡す引数
引数
[in]futureFuture<R> へのポインタ
[in]func1引数を取る関数や関数オブジェクト
[in]arg1関数に渡す引数
戻り値
0スレッドの実行が開始された場合
EINVALfuture 又は funcNULLだった場合
ENOMEM内部でメモリの確保に失敗した場合
説明
内部でfunc, arg1const_castされて、ムーブ(swapを利用)されます。 これによりオブジェクトのコピーを削減することができます。

Future.h1541 行目に定義があります。

§ Async() [3/6]

template<class FUNC , class R , class T1 , class T2 >
nn::nlib::threading::Async ( Future< R > *  future,
const FUNC &  func,
const T1 &  arg1,
const T2 &  arg2 
)
inline

関数を別スレッドで実行して実行結果をフューチャーによって取り出せるようにします。

テンプレート引数
Rfunc の戻り値の型
FUNCfunc の型
T1func に渡す引数
T2func に渡す引数
引数
[in]futureFuture<R> へのポインタ
[in]func実行する関数へのポインタ
[in]arg1関数に渡す引数
[in]arg2関数に渡す引数
戻り値
0スレッドの実行が開始された場合
EINVALfuture 又は funcNULLだった場合
ENOMEM内部でメモリの確保に失敗した場合

Future.h1560 行目に定義があります。

§ Async() [4/6]

template<class FUNC , class R , class T1 , class T2 , class T3 >
nn::nlib::threading::Async ( Future< R > *  future,
const FUNC &  func,
const T1 &  arg1,
const T2 &  arg2,
const T3 &  arg3 
)
inline

関数を別スレッドで実行して実行結果をフューチャーによって取り出せるようにします。

テンプレート引数
Rfunc の戻り値の型
FUNCfunc の型
T1func に渡す引数
T2func に渡す引数
T3func に渡す引数
引数
[in]futureFuture<R> へのポインタ
[in]func実行する関数へのポインタ
[in]arg1関数に渡す引数
[in]arg2関数に渡す引数
[in]arg3関数に渡す引数
戻り値
0スレッドの実行が開始された場合
EINVALfuture 又は funcNULLだった場合
ENOMEM内部でメモリの確保に失敗した場合

Future.h1587 行目に定義があります。

§ Async() [5/6]

template<class FUNC , class R , class T1 , class T2 , class T3 , class T4 >
nn::nlib::threading::Async ( Future< R > *  future,
const FUNC &  func,
const T1 &  arg1,
const T2 &  arg2,
const T3 &  arg3,
const T4 &  arg4 
)
inline

関数を別スレッドで実行して実行結果をフューチャーによって取り出せるようにします。

テンプレート引数
Rfunc の戻り値の型
FUNCfunc の型
T1func に渡す引数
T2func に渡す引数
T3func に渡す引数
T4func に渡す引数
引数
[in]futureFuture<R> へのポインタ
[in]func実行する関数へのポインタ
[in]arg1関数に渡す引数
[in]arg2関数に渡す引数
[in]arg3関数に渡す引数
[in]arg4関数に渡す引数
戻り値
0スレッドの実行が開始された場合
EINVALfuture 又は funcNULLだった場合
ENOMEM内部でメモリの確保に失敗した場合

Future.h1615 行目に定義があります。

§ Async() [6/6]

template<class FUNC , class R , class T1 , class T2 , class T3 , class T4 , class T5 >
nn::nlib::threading::Async ( Future< R > *  future,
const FUNC &  func,
const T1 &  arg1,
const T2 &  arg2,
const T3 &  arg3,
const T4 &  arg4,
const T5 &  arg5 
)
inline

関数を別スレッドで実行して実行結果をフューチャーによって取り出せるようにします。

テンプレート引数
Rfunc の戻り値の型
FUNCfunc の型
T1func に渡す引数
T2func に渡す引数
T3func に渡す引数
T4func に渡す引数
T5func に渡す引数
引数
[in]futureFuture<R> へのポインタ
[in]func実行する関数へのポインタ
[in]arg1関数に渡す引数
[in]arg2関数に渡す引数
[in]arg3関数に渡す引数
[in]arg4関数に渡す引数
[in]arg5関数に渡す引数
戻り値
0スレッドの実行が開始された場合
EINVALfuture 又は funcNULLだった場合
ENOMEM内部でメモリの確保に失敗した場合

Future.h1645 行目に定義があります。

§ GetFutureError()

template<class FutureResult >
nn::nlib::threading::GetFutureError ( FutureResult &  result)
inlinenoexcept

スレッドがエラー値を持つとき、それをシステムが取得できるようにするための関数です。

テンプレート引数
FutureResult関数の戻り値でFutureの値になる型
引数
[in,out]result関数の戻り値
戻り値
エラー値
説明
デフォルトでは0を返す関数です。テンプレートを特殊化して利用します。
スレッドがエラーを返す仕様にする必要がある場合、関数の戻り値の型にエラー値を含めることになります。 この関数を定義することによって何がエラー値なのかをライブラリコードに対して明確にすることができます。
スレッド実行のエラーを取得する必要のあるライブラリコードは、GetFutureError()を利用してエラーを取得しようとします。

Future.h20 行目に定義があります。

§ GetHardwareConcurrency()

size_t nn::nlib::threading::GetHardwareConcurrency ( )
inlinenoexcept

ハードウェアスレッドの数を返します。

戻り値
ハードウェアスレッドの数

Thread.h784 行目に定義があります。

§ MakeReadyFuture()

template<class R >
nn::nlib::threading::MakeReadyFuture ( Future< R > *  future,
const R &  value 
)
inline

予め値が設定されたFutureを作成します。

テンプレート引数
Rフューチャーの値型
引数
[in,out]future設定するFutureオブジェクトへのポインタ
[in]value設定する値
戻り値
0成功しました。
EINVALfutureNULLの場合
説明
I/FがFutureを利用するが計算結果は既に用意できているような場合、スレッドを起動せずにFutureに値を設定することになります。
そのような場合にこの関数を利用します。

Future.h1661 行目に定義があります。