与C ++没有严格的关系,我正在寻找更多关于如何处理这个问题的设计模式或建议。
说我有
class A
{
public:
void process();
void wait();
}
我将首先致电process()
,其中(duuh)会进行一些处理,然后拨打wait()
。 wait()
函数应该等待通知然后退出。我已经在单独的线程上有通知的逻辑,但我不确定最好的方法是什么。
我想到的是:
void A::wait()
{
while ( _notificationOccured == false )
{
}
}
其中_notificationOccured
可以是A
的bool成员,该成员将被通知更改。但是,再次,我不确定这是最好的方法。有什么建议吗?
答案 0 :(得分:2)
您所做的就是busy waiting。
有更好的方法可以做到这一点,最简单的方法是使用带有ncondition通知的普通互斥(win32 / pthreads / boost)。
答案 1 :(得分:2)
为变量池化会产生糟糕的性能,因为池化线程几乎占用了所有CPU时间。您需要使用事件或消息 - 这些内容是特定于平台的。您可以使用一些可移植的库,例如Boost。
答案 2 :(得分:1)
您当前的方法引入了一个电源循环,它会破坏您运行的系统的性能。你应该引入一个短暂的睡眠时间(10毫秒就足够了)来防止这种情况发生。更好的是,使用像Boost这样的库(如@Nim建议的那样)。
不过,像你这样的民意调查并不是一件好事。事实上,这就是所谓的spin-locks所做的。这个想法是,如果预期的等待时间很短,短时间的轮询比锁定更有效。答案 3 :(得分:0)
两个选项:
两者都是特定于操作系统,增强支持后者。还有其他方法(例如原子操作,但这些方法是如何暴露的是编译器特定的)。恕我直言,我会使用上述之一。
答案 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(...)