等待C ++中的通知

时间:2011-10-13 08:23:19

标签: c++ design-patterns language-agnostic notifications wait

与C ++没有严格的关系,我正在寻找更多关于如何处理这个问题的设计模式或建议。

说我有

class A
{
public:
   void process();
   void wait();
}

我将首先致电process(),其中(duuh)会进行一些处理,然后拨打wait()wait()函数应该等待通知然后退出。我已经在单独的线程上有通知的逻辑,但我不确定最好的方法是什么。

我想到的是:

void A::wait()
{
   while ( _notificationOccured == false )
   {
   }
}

其中_notificationOccured可以是A的bool成员,该成员将被通知更改。但是,再次,我不确定这是最好的方法。有什么建议吗?

5 个答案:

答案 0 :(得分:2)

您所做的就是busy waiting

有更好的方法可以做到这一点,最简单的方法是使用带有ncondition通知的普通互斥(win32 / pthreads / boost)。

答案 1 :(得分:2)

为变量池化会产生糟糕的性能,因为池化线程几乎占用了所有CPU时间。您需要使用事件或消息 - 这些内容是特定于平台的。您可以使用一些可移植的库,例如Boost。

答案 2 :(得分:1)

您当前的方法引入了一个电源循环,它会破坏您运行的系统的性能。你应该引入一个短暂的睡眠时间(10毫秒就足够了)来防止这种情况发生。更好的是,使用像Boost这样的库(如@Nim建议的那样)。

不过,像你这样的民意调查并不是一件好事。事实上,这就是所谓的spin-locks所做的。这个想法是,如果预期的等待时间很短,短时间的轮询比锁定更有效。

答案 3 :(得分:0)

两个选项:

  1. 信号灯
  2. 条件
  3. 两者都是特定于操作系统,增强支持后者。还有其他方法(例如原子操作,但这些方法是如何暴露的是编译器特定的)。恕我直言,我会使用上述之一。

答案 4 :(得分:0)

我只在Windows上知道这一点,所以我不知道这是否可以轻松转换为其他平台。

在伪代码中:

Timer myTimer(1, MYEVENT); // elapses every second
SetTimer( myTimer );       // register timer with event loop

while( running )
{
  if( GetEvent() == MYEVENT )
  {  

  }
}

在Windows中,GetEvent()被称为WaitForSingleObject(...)