【发布时间】:2012-03-26 16:39:43
【问题描述】:
我有一个后台线程:
class Queue
{
public:
Message* WaitForMessage(uint32_t uTimeOutMS);
private:
SignalObject soMessage; // Signalled when a message is added to the queue
};
class MyThread : Thread
{
public:
bool IsToStop() const { return soStop.IsSignalled(); }
void ThreadFunction()
{
while (!IsToStop()) {
Message* pMessage = queue1.GetMessage();
if (pMessage != nullptr) ProcessMessage(pMessage);
pMessage = queue2.GetMessage();
if (pMessage != nullptr) ProcessMessage(pMessage);
Sleep(100); etal // If I wait for 1 ms I hog the CPU, if I wait for 100 ms I waste time when the thread should be stopped
};
}
private:
SignalObject soStop; // Signalled when the thread should stop
Queue queue1;
Queue queue2;
};
我想摆脱睡眠并同时等待信号对象(这应该在我等待信号对象时释放一些 CPU)。 我可以让它们成为 Queue 上的信号对象,然后做这样的事情:
while (true) {
WaitForSignalObjectsForever(soStop, queue1.soMessage, queue2.soMessage); // Returns after any signal object is signalled
if (IsToStop()) break;
Message* pMessage = queue1.GetMessage();
if (pMessage != nullptr) ProcessMessage(pMessage);
pMessage = queue2.GetMessage();
if (pMessage != nullptr) ProcessMessage(pMessage);
}
或者这个:
while (true) {
soStop.WaitForSignalObjectsForever(queue1.soMessage, queue2.soMessage); // Returns after any signal object is signalled
if (IsToStop()) break;
Message* pMessage = queue1.GetMessage();
if (pMessage != nullptr) ProcessMessage(pMessage);
pMessage = queue2.GetMessage();
if (pMessage != nullptr) ProcessMessage(pMessage);
}
或者这个:
while (WaitForSignalObjectsOrIsToStopForever(queue2.soMessage, queue1.soMessage)) { // Returns true if soStop is signalled, false if one of the other signal objects was signalled
Message* pMessage = queue1.GetMessage();
if (pMessage != nullptr) ProcessMessage(pMessage);
pMessage = queue2.GetMessage();
if (pMessage != nullptr) ProcessMessage(pMessage);
}
我认为我更喜欢第一个版本,因为它更通用。不过,我仍然对将信号对象公开(或通过朋友访问保护)感到恶心。谁有更好的解决方案?
我也习惯称它们为信号对象,有没有更通用的名称?
【问题讨论】:
标签: c++ multithreading message-queue