When using a globally named mutex to synchronize across two processes, and one of the two processes are killed (say in Task Manager, or due to a fault), the other process returns from WaitForSingleObject()
with the appropriate error code and can continue.
When using a globally name semaphore, it does not release the waiting process if the other process is killed / terminated. WaitForSingleObject()
will wait until it times out (which may be INFINITE
or hours).
How do I stop WaitForSingleObject()
from waiting when the other process is killed or terminated?
In this case, there is a single count on the semaphore used to control read/write requests of a shared buffer. The Requester signals the Provider to provide certain data, the Provider updates the buffer and signals back to the Requester that it can now read the buffer.
CodePudding user response:
I suggest that you switch to using WaitForMultipleObjects and wait for the handle of the process that might get terminated (or thread if you want to do this within a single process) in addition to your semaphore handle. That way you can continue to use INFINITE timeouts. Just have to check the return value to see which object was signalled.
Also, I would consider a process terminating while holding a semaphore somewhat of a bug, particularly a semaphore used for actual inter-process communication.
CodePudding user response:
Adding to the accepted answer.
I added logic if the waitms
was going to be longer than some value maxwaitms
then the requester/provider exchange the providers process id (GetCurrentProcessId()
) before the long process. The requester opens a handle (OpenHandle()
) to the provider process and waits on both the semaphore and the process handle to know when writing is done (or process terminated).