Linux下AutoResetEvent的C ++等效项是什么?

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的文档,条件变量和自动重置事件并不相同,并且行为也不相同。

以上是 Linux下AutoResetEvent的C ++等效项是什么? 的全部内容, 来源链接: utcz.com/qa/398860.html

回到顶部