我正在研究一個涉及兩個過程的項目,讓他們成爲A和B. A有兩個線程:T1和T2。有什麼辦法可以將崩潰進程同步到進程中?
A和B分別運行。
在某個時刻T1向B發送一條消息(這是一個COM調用,一個搜索請求)給B。當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(即如何實現「中止搜索」)?
這真的很複雜。既然你總是等待結果,爲什麼不在T1中使用同步調用,並在調用完成時將結果傳遞給T2呢?讓COM照顧家務。 – arx
我無法訪問B代碼,所以我無法修改它。 B的設計就是這樣的:它公開了一個異步接口並使用調度接口進行回調。 'T2'實際上是ATL Sink線程。 – Emiliano