提问人:Luchian Grigore 提问时间:10/13/2011 更新时间:10/13/2011 访问量:1062
在 C++ 中等待通知
Wait for a notification in C++
问:
与 C++ 没有严格关系,我正在寻找更多的设计模式或有关如何解决这个问题的建议。
说我有
class A
{
public:
void process();
void wait();
}
我将首先调用 ,它 (duuh) 进行一些处理,然后调用 。该函数应该等待通知,然后退出。我已经在单独的线程上拥有通知的逻辑,但我不太确定最好的方法是什么。process()
wait()
wait()
我想到的是:
void A::wait()
{
while ( _notificationOccured == false )
{
}
}
其中可以成为 BOOL 成员的位置将通过通知进行更改。但是,同样,我不确定这是否是最好的方法。有什么建议吗?_notificationOccured
A
答:
两个选项:
- 信号灯
- 条件
两者都是特定于操作系统的,boost 支持后者。还有其他方法(例如原子操作,但这些操作的公开方式是特定于编译器的)。恕我直言,我会使用上述方法之一。
评论
std::async()
你所做的被称为忙于等待。
有各种技术可以更好地做到这一点,最简单的方法是使用带有 ncondition 通知的普通互斥锁 (win32/pthreads/boost)。
评论
变量的池化性能很差,因为池化线程几乎占用了所有的 CPU 时间。你需要使用事件或消息 - 这些东西是特定于平台的。为此,您可以使用一些可移植库,例如 Boost。
评论
您当前的方法引入了电源环路,这将扼杀您正在运行的系统的性能。您应该引入较短的睡眠时间(10 毫秒就足够了)以防止这种情况发生。更好的是,使用一个库,比如 Boost(如@Nim建议的那样)。
顺便说一句,像你这样的民意调查并不全是坏事。事实上,这就是所谓的自旋锁的作用。这个想法是,如果预期的等待时间很短,那么短时间的轮询比锁定更有效。
评论
我只从 Windows 中知道这一点,所以我不知道这是否很容易转换为其他平台。
在伪代码中:
Timer myTimer(1, MYEVENT); // elapses every second
SetTimer( myTimer ); // register timer with event loop
while( running )
{
if( GetEvent() == MYEVENT )
{
}
}
在 Windows 中,GetEvent() 称为 WaitForSingleObject(...)
下一个:如何设计模块?
评论