如何解决如何按FIFO顺序处理事件?
我正在编写一个在State对象中维护状态的程序。每次状态更改时,都会在此程序中创建一个新线程,并在该线程上调用一个回调函数,并将新状态作为参数传递给该函数。此功能称为OnStateChange
。
对于这个问题,我只关注2个状态:State1
,State2
。以下是与这两种状态相关的语义:
- 状态1:如果状态已更改为
State1
,请检查该状态是否持续80秒。如果状态持续80秒,则调用DoWorkForState1(...)
,否则,如果状态不持续(另一个状态更改事件在80秒内发生),则丢弃DoWorkForState1(...)
。如果在线程已经等待80秒的同时将对State1
的更改放入队列中,请为State1
删除此新事件,并让现有线程完成工作。 - 状态2:这应使线程处理
State1
并等待80秒,以不调用DoWorkForState1(...)
。DoWorkForState2(...)
现在应该被呼叫。
我致力于的解决方案,但是很快我意识到它可能会失败:
Event StateTransition; // Event that is set when a state change occurs
Boolean IsAThreadWaitingOnState1;
Function OnStateChange(NewState) // Callback invoked a new thread every time StateTransition occurs
{
Lock(); // Protect the write to the State variable in a lock
State = NewState;
Unlock();
if (NewState == State2)
{
SetEvent(StateTransition); // Let threads waiting for 80 seconds on State1 know,state has changed to State2
DoWorkForState2();
}
else if (NewState == State1)
{
Lock();
if (IsAThreadWaitingOnState1 == true)
{
Unlock();
return; // Drop this State1 since a thread is already waiting for 80 seconds
}
IsAThreadWaitingOnState1 = true;
Unlock();
Result = WaitOnEvent(Event = StateTransition,Time = 80 seconds); // Assume an API that lets you wait on an event for a specified time
ResetEvent(StateTransition)
if (Result == Timeout) // If State1 persits,Do work for this state
{
DoWorkForState1();
}
}
}
如果上述回调过程按生成顺序改变了状态,但锁定功能不能确保此结果,则上述解决方案将正常工作。
例如,如果状态转换为:State1,State2,State1和相应的回调在线程T1,T2,T3上运行。
所需的结果应该是第一个State1将等待80秒,State2在80秒内到达并从前一个State1出队。下一个State1等待80秒并运行,因为随后没有状态更改。
如果调度程序以T1,T3,T2的身份运行线程,则结果将是第一个State1到达并等待80秒,第二个State1到达并被丢弃(因为T1已经在等待),State2在80秒内到达并出队第一个State1也是如此。结果显然不同。
还有其他问题。谁能为这个问题提出一个好的解决方案?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。