This Project Has Not Released Any Files
今んとこWindowsだけ :b
ヘッダーファイル:roast/thread.hpp
- typedef int (*roast_thread_callback_t)(int);
- namespace roast
- {
- class thread_exception : public ::std::string
- {
- public:
- thread_exception(const char* msg) : ::std::string(msg) {}
- thread_exception(const ::std::string &s) : ::std::string(s) {}
- };
- template <typename _Impl>
- class thread_
- {
- public:
- thread_();
- thread_(roast_thread_func_t func, int param=0, void* opt=NULL);
- template <typename T> thread_(const T &cls, int param=0, void* opt=NULL);
- template <typename T> thread_(T *ptr, int param=0, void* opt=NULL);
- template <typename T> thread_(int (T::*func)(int), T *ptr, int param=0, void* opt=NULL);
- bool start_func(roast_thread_func_t func, int param=0, void* opt=NULL);
- template <typename T> bool start_class(const T &cls, int param=0, void* opt=NULL);
- template <typename T> bool start_class_ptr(T *ptr, int param=0, void* opt=NULL);
- template <typename T> bool start_class_ptr(int (T::*func)(int), T *ptr, int param=0, void* opt=NULL);
- bool start(roast_thread_func_t func, int param=0, void* opt=NULL);
- template <typename T> bool start(const T &cls, int param=0, void* opt=NULL);
- template <typename T> bool start(T *ptr, int param=0, void* opt=NULL);
- template <typename T> bool start(int (T::*func)(int), T *ptr, int param=0, void* opt=NULL);
- bool release();
- bool join(unsigned int timeout_ms=-1);
- bool is_alive();
- int get_result();
- void* get_native_handle();
- };
- #ifdef WIN32
- typedef thread_< _thread_impl_win32> thread;
- #endif//WIN32
- }
のようにする事により、関数 any_func() をコールバック関数として使用したスレッドを起動します。
コールバック関数の型は
としてtypedefされており、一つのint型引数を取り、intを復帰する関数(ないしそれに相当する関数をキャストしたもの)である必要があります。
このコールバック関数のint型引数には、上記例では0が渡されますが
のように、第二パラメータを指定する事により、第二パラメータの値が渡されるようになります。(上記例では10)
複数のパラメータを渡したい場合には、それらを構造体化し、ポインタを渡すようにします。
引数なしコンストラクタを用いたい場合は、
のように、start()メソッドを使用します。
join()メソッドを使用することにより、スレッドの終了を待機する事が出来ます。
引数として指定しているのは、終了待ちのタイムアウト時間(ミリ秒)です。
省略、または-1を指定した場合には無限に待ちます。
タイムアウト時間を経過してもスレッドが終了しなかった場合(及びもしくは何らかのエラーが有った場合)、join()メソッドはfalseを返します。
タイムアウト時間内にスレッドが終了した場合にはtrueを返します。
スレッドの生存状態(コールバック関数が既に終了状態にあるかどうか)を取得するには、is_alive()メソッドを使用します。
is_alive()メソッドは、スレッドがまだ生存状態にある場合にはtrueを、終了している場合にはfalseを返します。
get_result()メソッドを使用することにより取得できます。
のようにすれば、クラス内のstaticメソッドを起動する事も可能です。
メソッドが非staticである場合、第二引数としてそのクラスのインスタンスへのポインタを指定する必要があります。
またコンパイラによっては上記の第一引数のように、メンバ関数ポインタへの&の付加が求められる場合もあります。
関数の代わりに関数オブジェクトを指定する事も出来ます。
また、同様のstartメソッドによる起動や、引数指定も可能です。
コンストラクタ、及びstartメソッドの第一引数として渡された関数オブジェクトは コピーコンストラクタにより内部的にコピーされたものが使用されます。
このため、パフォーマンスの問題や、コピーコンストラクタによりコピーされた場合正常に動作しない、 ないし処理中や処理結果の関数オブジェクトインスタンスを使用したい場合等の場合には、 予め変数を宣言し、そのポインタを指定する事により、インスタンスのコピーを行わず、 直接指定ポインタのインスタンスを使用させる事が可能です。
startメソッドは復帰値型boolになっており、スレッド作成失敗時にはfalseを復帰する。 しかしコンストラクタは復帰値を持てないため、スレッド作成失敗時には thread_exception クラスによる例外を送出するようになっている。