MSDN中AutoResetEvent的描述
我正在尝试将在C#中实现的线程池移植到Linux下的C ++。我不知道应该使用哪些行为与“ AutoResetEvent”类似的函数。
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 thread\n"); event.Set(); pthread_join(h, NULL); return 0; }
但是,如果您需要命名的自动重置事件,则可能需要查看信号量,并且可能很难翻译代码。无论哪种方式,我都会仔细查看平台上pthread的文档,条件变量和自动重置事件并不相同,并且行为也不相同。