私は、2 つのプロセスを含むプロジェクトに取り組んでいます。それらを A と B とします。A には、T1 と T2 の 2 つのスレッドがあります。
A と B は別々に実行されます。
ある時点で、T1 はメッセージ (COM 呼び出し、検索要求) を B に送信します。B がデータを処理すると、結果 (これも COM 呼び出し、検索結果) を直接 T2 に送信して返します。T2 が B のデータを処理するまで、T1 をブロックする必要があります。これまでのところ、次のソリューションを使用しました。
初期化:
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 が非常に高速であるため、T1 が WaitForSingleObject 行に到達する前に T2 が ReleaseSemaphore を呼び出す場合でも機能します。
私の問題は、B がクラッシュしたらどうなるかということです。T1は永遠に待つだけです。タイムアウトを指定する必要がありますが、T2 が結果を受け取るときにタイムアウトが短すぎると、セマフォが台無しになり、次の検索が台無しになります。
では、T2 が呼び出されないことを考慮して、これら 2 つのスレッドを正しく同期するにはどうすればよいでしょうか (つまり、「検索の中止」を実装するにはどうすればよいでしょうか)。