I have several threads that acquire Mutexes and then terminate.
The mutexes are stored in a main repository, and are properly released when the program exists. Howev
Response to the question
AFAIK there exist no such Mutex class. The AbandonedMutexException is quite annoying but it represents a real situation that can occur for which there is no automatic solution.
When you have cross process, or even cross thread communication, you must deal with the fact that any one of the participating entities can be unexpected and suddenly terminated for any number of reasons. Mutex's exist to protect resources, if a thread is abandoned while it holds a Mutex there is no way for the OS to guarantee that it left data in any consistent manner. This is very important because it means that the abandoning of the thread could have invalidated certain invariants being depended on by other threads.
The AbandonedMutexException is a way of proactively saying "bad things happened and you are now in an indeterminate state". There is really no other recoures for the operating system here.
Response to your answer
EventWaitHandle is different that Mutex and serves different purposes.
Mutex is used to protect a particular resource much like a lock statement. When a particular thread acquires a mutex it is said to own the Mutex. There can only be one owner at a time. So if all threads involved agree to only touch a resource when they have ownership of the Mutex, you can safely access a resource across thread.s
EventWaitHandle can be visualed, to a degree, as a thread safe event. It has the concept of signaled and unsignaled and any number of threads can wait for it to hit a signaled state. When it is signaled one of the waiting threads will be woken up and will start processing.
You can use an EventWaitHandle to implement a form of thread safety. Instead of lock ownership being the key to accessing the resource, being signaled from the event is the key to accessing the resource. However, the devil is once again in the details.