我正在做一个涉及两个进程的项目,让它们成为 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 在 T1 到达 WaitForSingleObject 行之前调用 ReleaseSemaphore,它也可以工作。
我的问题是:如果 B 崩溃会发生什么?T1 将永远等待。我必须指定超时时间,但如果 T2 收到结果时它太低,它只会搞砸信号量,弄乱下面的搜索。
那么考虑到 T2 永远不会被调用(即如何实现“中止搜索”),我如何正确同步这两个线程?