我有以下代码复制Windows手动和自动重置事件。pthread窗口事件等效问题
class event
{
public:
event(bool signalled = false, bool ar = true) :
_auto(ar),
_signalled(signalled)
{
pthread_mutex_init(&_mutex, NULL);
pthread_cond_init(&_cond, NULL);
}
~event()
{
pthread_cond_destroy(&_cond);
pthread_mutex_destroy(&_mutex);
}
void set()
{
pthread_mutex_lock(&_mutex);
// only set and signal if we are unset
if (_signalled == false)
{
_signalled = true;
pthread_cond_signal(&_cond);
}
pthread_mutex_unlock(&_mutex);
}
void wait()
{
pthread_mutex_lock(&_mutex);
while (_signalled == false)
{
pthread_cond_wait(&_cond, &_mutex);
}
// if we're an autoreset event, auto reset
if (_auto)
{
_signalled = false;
}
pthread_mutex_unlock(&_mutex);
}
void reset()
{
pthread_mutex_lock(&_mutex);
_signalled = false;
pthread_mutex_unlock(&_mutex);
}
private:
pthread_mutex_t _mutex;
pthread_cond_t _cond;
bool _signalled;
bool _auto;
};
我的问题围绕“优化”我已经到位的set()
方法,其中我只叫pthread_cond_signal()
如果事件unsignalled。这是一个有效的优化,还是我通过这样做引入了一些细微的缺陷。
这就是非自动重置事件,您可能只需要在重置之前根据多个设置执行1个操作。所以set()对于“优化”实际上更好。通常情况下,条件变量应该表示条件的变化。 – stefaanv 2010-03-08 12:39:24
@David。我同意你的评价,并感谢你的评论。 事件的自动重置特性是这样的,即对已经发送信号的对象的调用集合是无操作的。所以我认为我拥有的代码是可以的,但我可以接受争论。 – ScaryAardvark 2010-03-08 13:21:50
如果在已经设置的手动重置事件上调用set是noop,那么这不是一种优化,它需要正确的行为。否则,在事件再次重置之前调用set会解除阻塞其他线程。 – nos 2010-03-08 18:04:42