c – 有没有办法同步考虑崩溃的进程?

我正在研究一个涉及两个过程的项目,让它们成为A和B.
A有两个线程:T1和T2.

A和B分开运行.

在某个时刻,T1向B发送消息(它是一个COM调用,一个搜索请求).当B处理了一些数据时,它通过将结果(再次,它是一个COM调用,搜索结果)直接发送到T2来返回.
我需要T1来阻止,直到T2处理了B的数据.
到目前为止我使用了以下解决方案:

初始化:
searchSyncSempahore = :: CreateSemaphore(NULL,0,1,NULL);

T1:

B_handle->search(searchString);
::WaitForSingleObject(searchSyncSempahore, INFINITE);
// Use searchResult variable

T2:

searchResult = _some_data_from_B;
::ReleaseSemaphore(searchSyncSempahore, 1, NULL);

这项工作到目前为止.即使B非常快,T2在调用WaitForSingleObject行之前调用ReleaseSemaphore也能正常工作.

我的问题是:如果B崩溃会发生什么? T1将永远等待.我必须指定超时,但如果T2收到结果时它太低,它只会搞砸信号量,弄乱后面的搜索.

那么我怎样才能正确地同步这两个线程,同时考虑到T2永远不会被调用(即如何实现“中止搜索”)?

解决方法:

可能的解决方案是创建一个看门狗线程,它将使用Manual-Reset events处理这种情况.因此逻辑将改变一个小的:不是等待互斥锁,你可以等待事件.看门狗线程可以检查线程是否卡住了很长时间,只是自己设置事件并且可以设置一个额外的事件,说明出现了危急情况.
我的意思是这第三个线程可以充当看门狗定时器.

另一种变体是在第三个线程中使用Condition Variables.所以,你可以简单地踢一个条件变量,它会唤醒等待它的线程.我必须承认,我对这种方法并不是很熟悉.

更新:
考虑使用SignalObjectAndWait功能.该函数发出一个对象的信号,并作为单个操作等待另一个对象.此外,您可以设置等待超时,并且如果间隔过去,函数将返回,即使对象的状态是非信号的.

使用线程监视程序的另一个好处是,您可以在其中执行其他操作:登录到文件甚至在MS EventLog中,或者可以提供更改应用程序行为的逻辑.另一个例子是监视程序线程可以实现“线程冗余”功能.

上一篇:Java:如何同步数组访问以及对同步条件中的内容有何限制


下一篇:Java – 在另一个线程中使用可变对象引用的首选设计?