我有两个事件被两个事件处理程序触发和处理。
在EventHandler2
boost::thread
启动了join()
。
在EventHandler2中,应用程序正在等待该线程完成,方法是调用它上面的join()
。
这在快速计算机上运行得很好,因为启动线程的事件总是先触发,然后导致应用程序进入EventHandler2
的另一个事件。
但是,在旧机器上,事件以不同的顺序触发(因为在调用EventHandler1
之前需要进行一些繁重的计算)。
所以首先调用join()
并且不等待,因为join()
立即返回(线程尚未启动,因为第二个事件未被触发)。
我能在这做的最好吗?在调用join()
之前,是否需要锁定互斥锁然后等待它。这样我确保线程在调用jQuery.sap.require("sap/ui/thirdparty/d3");
jQuery.sap.declare("className");
sap.ui.core.Control.extend("className", {
init:...
renderer:...
onAfterRendering:...
...}
之前启动。
什么是在这种情况下使用的最佳模式?
谢谢!
答案 0 :(得分:0)
您似乎需要指定执行的顺序或优先级。从你的问题来看,你似乎也有异类线程(就行为而言),所以我建议同步。仅mutex
可能是不够的(尽管在许多实现中,互斥量与二进制信号量相同)。一种简单的方法是使用显示器。 https://en.wikipedia.org/wiki/Monitor_(synchronization)
答案 1 :(得分:0)
解释问题(让我知道,如果我误解了):你有两个将被执行的事件处理程序(A和B),并且不能保证首先执行哪一个 - 执行顺序可能是(A,B)或它可能是(B,A)...但在任何一种情况下你都希望系统表现好像处理程序已在(A,B)执行订购。
我解决这个问题的方法是使处理程序更智能,以便他们可以检测何时首先执行“错误”处理程序并优雅地处理它。特别是,当您的B处理程序执行时,它应该有一种方法来检测A处理程序是否已经执行。如果B看到A已经执行了,那么B可以做正常的事情(即join()线程)并且一切都很好。另一方面,如果B发现A尚未执行,那么B应该只设置一个标志(可能是A有权访问的数据结构中的布尔值?),这样当A处理程序稍后运行时,它就会我知道B处理程序已经过去了,因此A会知道它不能依赖B做任何清理工作。也就是说,当A运行时,它会检查标志;如果标志是由B设置的,那么A也会在返回之前调用join(),因为A知道B以后不会这样做(或者,如果你不打电话,也许A可以调度另一个B事件直接从A处理程序加入()。
如果您的A和B处理程序都在同一个线程中被调用,那么这应该是直截了当的;如果从不同的线程调用A和B,则需要更加小心地以线程安全的方式执行标志处理(例如,使用std :: atomic或类似的)。