我有一个从消息队列中读取的类。现在这个类里面也有一个线程。根据msg q中msg的类型,它需要在该线程内执行不同的函数,因为类中的主线程始终在msg q上等待。一旦它从队列中读取消息,它就会检查其类型并调用在线程中执行的适当方法,然后再次返回读取(读取while循环)。
我正在使用提升消息q和提升线程 我怎样才能做到这一点。 它是这样的:
while(!quit) {
try
{
ptime now(boost::posix_time::microsec_clock::universal_time());
ptime timeout = now + milliseconds(100);
if (mq.timed_receive(&msg, sizeof(msg), recvd_size, priority, timeout))
{
switch(msg.type)
{
case collect:
{
// need to call collect method in thread
}
break;
case query:
{
// need to call query method in thread
}
break;
等等。 可以吗?
如果可以完成,那么当线程说执行collect方法并且主线程获取查询消息并想要调用它时会发生什么。 提前谢谢。
答案 0 :(得分:1)
接收线程执行长操作时到达的消息将被存储以供稍后(在队列中,等待处理)。
如果线程完成了它的操作,它将返回并再次调用receive函数,并立即获得在它没有查看时到达的第一条消息,并且可以处理它。
如果主线程需要消息处理操作的结果,它将阻塞,直到工作线程完成并传递结果。
确保在工作线程内部没有做任何事情,而工作线程又会等待主线程的操作,否则存在死锁的风险。