C++0x ではスレッドライブラリが標準提供されます。
スレッド関連のヘッダは
基本的には Boost.Thread と同じように使えます。
(最近は Boost.Thread が C++0x に合わせて修正されているようです)
#include <threads> struct do_work { void operator()() {} }; int main() { do_work dw; std::thread t(dw); t.join(); }
#include <mutex> std::mutex m; struct hoge {} data; void process(const hoge&) {} void foo() { std::lock_guard<mutex> lk(m); process(data); } // unlock mutex
#include <mutex> #include <condition_variable> std::mutex m; std::condition_variable cond; bool data_ready; void process_data(){} void foo() { std::unique_lock<mutex> lk(m); cond.wait(lk, []{ return data_ready; }); process_data(); }
今のところ Boost.Thread と違うところは、 sleep_until と sleep_for で、これらは
namespace std { namespace this_thread { template <class Clock, class Duration> void sleep_until(const chrono::time_point<Clock, Duration>& abs_time); template <class Rep, class Period> void sleep_for(const chrono::duration<Rep, Period>& rel_time); } }
sleep_until は指定した日時まで sleep して、 sleep_for は指定した時間だけ sleep します。
sleep_until(system_clock::now() + milliseconds(10)); // 現在日時 + 10ミリ秒までsleep sleep_for(milliseconds(10)); // 10ミリ秒間sleep
同じように、 timed_mutex/recursive_timed_mutex に try_lock_until/try_lock_for が入り、
condition_variable/condition_variable_any に wait_until/wait_for が入ります。
あと、 interrupt はないみたいです。(condition_variable で似たようなことはできるとかなんとか)
N2497 Multi-threading Library for Standard C++ (Revision 1)
N2661 A Foundation to Sleep On