Subj : really simple portable eventcount... To : comp.programming.threads From : SenderX Date : Sat Mar 05 2005 10:54 pm This is real fast in the signals without waiters case: // pseudo-code class ec { pthread_mutex_t m_mutex; pthread_cond_t m_cond; int m_waiters; int m_ec; public: ec() : m_waiters( 0 ), m_ec( 0 ) { // init mutex and cond } public: int get() { int local = m_ec; atomic_bitset( &m_ec, 0x80000000 ); return local & 0x7FFFFFFF; } int signal() { int local = m_ec; if ( local & 0x80000000 ) { pthread_mutex_lock( &m_mutex ); while ( ! cas( &m_ec, local, ( local + 1 ) & 0x7FFFFFFF ) { local = m_ec } local = m_waiters m_waiters = 0; pthread_mutex_unlock( &m_mutex ); if ( local ) { pthread_cond_broadcast( &m_cond ); } } } int wait( int cmp ) { int local = m_ec & 0x7FFFFFFF; if ( local == cmp ) { pthread_mutex_lock( &m_mutex ); local = m_ec & 0x7FFFFFFF; if ( local == cmp ) { ++m_waiters; pthread_cond_wait( &m_cond, &m_mutex ); } pthread_mutex_unlock( &m_mutex ); } } }; Can be used as a simple signal for lock-free algorithms. .