VC++11、標準C++ライブラリが出揃ってきててキモチイイっす。
thread, mutex, condition_variable が追加されてたんでこないだ書いたランデブーがこんなんなりました。
#include <mutex> // mutex, unique_lock
#include <condition_variable> // condition_variable
#include <stdexcept> // invalid_argument
class rendezvous {
public:
rendezvous(unsigned int count)
: threshold_(count), count_(count), generation_(0) {
if (count == 0) {
throw std::invalid_argument("count cannot be zero.");
}
}
bool wait() {
std::unique_lock<std::mutex> lock(mutex_);
unsigned int gen = generation_;
if ( --count_ == 0) {
generation_++;
count_ = threshold_;
condition_.notify_all();
return true;
}
while (gen == generation_ ) {
condition_.wait(lock);
}
return false;
}
private:
std::mutex mutex_;
std::condition_variable condition_;
unsigned int threshold_;
unsigned int count_;
unsigned int generation_;
};
Win-APIだとコードの見てくれがギコギコすんだけど、
標準ライブラリだと涼しげでよろしぃですな。