
Hello, In the Join library I have see the following idiom mutex mtx; condition_variable cond; unsigned num_blocked; void foo() { unique_lock l(mtx); ++num_blocked; cond.wait(lock); --num_blocked; // ... } void foo() { unique_lock l(mtx); // ... if (num_blocked > 0) cond.notify_one(); // ... } Does this perform better in some contexts? if yes in which ones? If yes, does this justify a condition wrapper like: template < class Condition
class condition_booster{ public: typedef Condition condition; void notify_one() { if (num_blocked > 0) cond.notify_one(); } void notify_all() { if (num_blocked > 0) cond.notify_all(); } template <typename Locker, typename Predicate> template <typename Locker> void wait(Locker& lock) { ++num_blocked; cond.wait(lock); --num_blocked; } void wait(Locker& lock, Predicate& pred) { while(!pred()) wait(lock); } // ... private: Condition cond; unsigned num_blocked; }; Best _____________________ Vicente Juan Botet Escriba