并发事件处理程序具有竞争条件.如何修复它们



事件处理程序E1发出长时间运行的网络请求。事件处理程序E2非常快速,不会发出网络请求。它写入数据库。

E1保证在E2之前开始执行,但是E1在E2之后结束。如何强制E2始终在E1之后结束?

谢谢。

您没有提到任何语言。我喜欢Java,但在许多语言和库中都可以找到类似Semaphore的东西。

Semaphore sem = new Semaphore(0);
void E1(...) {
doSomeStuff();
sem.release();
}
void E2(...) {
doStuffThatsSafeToDoWhile_E1_StillIsDoingItsStuff();
sem.acquire();
doStuffThatMustWaitUntilAfter_E1_IsFinished();
}

这只适用于E1E2的一对调用。我不想提出任何";重置";它可以一次又一次地使用。我将把这部分留给你,因为我不想假设E1E2之间的关系。我不知道为什么有些东西必须等到E1完成。我不知道";成品";真的很有意思。如果允许再次调用E1E2,我不知道为了允许它发生了什么


编辑:

也许,在高水平上,你真的只处理一个";事件;但是在底层,您可以分两部分获得该事件的通知。

如果是这样的话,那么我们在一个处理程序函数中做所有的工作来处理高级事件,而让另一个处理函数什么都不做,只在第一个处理程序可以安全地完成需要完成的事情时打开一个门?

Semaphore sem = new Semaphore(0);
void E1(...) {
doStuffThatCanBeSafelyDoneBefore_E2_isCalled();
sem.acquire();
doStuffThatMustNotBeDoneUntilAfter_E2_isCalled();
}
void E2(...) {
sem.release();
}

最新更新