AutoResetEvent最类似于二进制信号量。人们说“条件变量”本身并没有错,但是条件变量用于类似的情况,而不是类似的对象。您可以在条件变量之上实现一个(未命名的)AutoResetEvent:
#include <pthread.h>#include <stdio.h>class AutoResetEvent{ public: explicit AutoResetEvent(bool initial = false); ~AutoResetEvent(); void Set(); void Reset(); bool WaitOne(); private: AutoResetEvent(const AutoResetEvent&); AutoResetEvent& operator=(const AutoResetEvent&); // non-copyable bool flag_; pthread_mutex_t protect_; pthread_cond_t signal_;};AutoResetEvent::AutoResetEvent(bool initial): flag_(initial){ pthread_mutex_init(&protect_, NULL); pthread_cond_init(&signal_, NULL);}void AutoResetEvent::Set(){ pthread_mutex_lock(&protect_); flag_ = true; pthread_mutex_unlock(&protect_); pthread_cond_signal(&signal_);}void AutoResetEvent::Reset(){ pthread_mutex_lock(&protect_); flag_ = false; pthread_mutex_unlock(&protect_);}bool AutoResetEvent::WaitOne(){ pthread_mutex_lock(&protect_); while( !flag_ ) // prevent spurious wakeups from doing harm pthread_cond_wait(&signal_, &protect_); flag_ = false; // waiting resets the flag pthread_mutex_unlock(&protect_); return true;}AutoResetEvent::~AutoResetEvent(){ pthread_mutex_destroy(&protect_); pthread_cond_destroy(&signal_);}AutoResetEvent event;void *otherthread(void *){ event.WaitOne(); printf("Hello from other thread!n"); return NULL;}int main(){ pthread_t h; pthread_create(&h, NULL, &otherthread, NULL); printf("Hello from the first threadn"); event.Set(); pthread_join(h, NULL); return 0;}但是,如果您需要命名的自动重置事件,则可能需要查看信号量,并且可能很难翻译代码。无论哪种方式,我都会仔细查看平台上pthread的文档,条件变量和自动重置事件并不相同,并且行为也不相同。



