标题可能会让我有点偏离,但我有一个非常具体的问题,我似乎无法解决。我会尽力解释它。
假设我有2个线程(T1和T2)在2个不同的端口上侦听消息(M1和M2)。
消息从同一来源发送,消息时间很短。
M2消息比M1更多,但M1消息是优先的,影响M2消息的处理。
存在执行锁定,因此线程不会同时执行。
我对此案有疑问:
M1 - 离开来源
M2 - 在B1之后立即离开源
由于某种原因,M2消息到达M1之前处理的目标并唤醒其线程。但是,M1中的数据会影响M2中的处理,因此我会得到错误的结果。
性能是一个问题,M1的数量小于M2的数量,所以我不能在M2线程中等待,因为大部分时间我都在消耗时间。
到目前为止,我能想到的最好的是在获取执行锁之前强制执行M2消息的线程上的thread_yield,以便给另一个线程提供更好的机会,但我觉得我对我的信任线程调度程序的手,因为这应该是可移植的,我宁愿避免这样做。
我有什么选择?
谢谢
答案 0 :(得分:0)
我建议您定义一个最大延迟参数,该参数定义M1消息可以在相应的M2消息后合理延迟的最长时间。为了避免浪费这个时间,M2可以继续处理它的消息并将它们放入一个中间结果队列中(尽可能多地执行计算而不需要'提交',但是你定义了这个)。所以这里有一些伪代码示例:
void handleM2SocketEvent()
{
auto data = readFromSocket();
auto result = preliminaryProcessData();
resultQueue_.push_back(result);
auto currTime = getTime();
while(resultQueue_.front().processTime() + param_maxDelay > currTime) {
resultQueue.front().commit();
resultQueue.pop_front();
}
}
答案 1 :(得分:0)
您试图通过锁定线程执行来保护哪些数据,因此一次只能运行一个?这听起来像是一个重大的设计缺陷。
如果改变设计的这个方面不是一个选项,那么我建议两个线程等待M1& M2只是将这些消息放入队列中。然后有第三个线程处理队列。因为您希望M1具有更高的优先级,所以您可以将任何这些消息添加到队列的顶部。
然后,第三个线程将监视一个事件对象,该事件对象在M1消息到达时随时发出信号。当事件被触发时,第三个线程停止处理M2并首先开始处理M1。