C++0x thread

C++0x ではスレッドライブラリが標準提供されます。

スレッド関連のヘッダは , , の 3 つです。


基本的には 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 で、これらは を使用した sleep です。

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

C++0x言語拡張まとめ