Linux下的AutoResetEvent的C++等价物是什么?

der*_*khh 9 .net c# c++ linux multithreading

MSDN中AutoResetEvent的说明

我正在尝试将在C#中实现的线程池移植到Linux下的C++中.我不知道我应该使用哪些功能与"AutoResetEvent"具有相似的行为.

Log*_*ldo 11

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;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果你需要一个名为自动复位的事件,你可能会想看看信号灯,并可能有一个稍微困难的时候,翻译你的代码.无论哪种方式,我都会仔细查看平台上pthreads的文档,条件变量和自动重置事件不一样,并且行为不一样.