Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
So far so good but there is one more thing I want the MutexLock to do. The Mutex object may throw an exception (AbandonedMutexException) when being waited for if the current owning thread terminates without releasing the mutex. I want to hide that fact in my MutexLock so I don't need to handle that exception everywhere in my code:
1: public class Given_an_abandoned_lock : IDisposable
2: {
3: private MutexLock _lock = new MutexLock();
4: private EventWaitHandle _threadStarted = new EventWaitHandle(false, EventResetMode.ManualReset);
5: private EventWaitHandle _threadStop = new EventWaitHandle(false, EventResetMode.ManualReset);
6: private Thread _thread;
7:
8: public Given_an_abandoned_lock()
9: {
10: _thread = new Thread(() =>
11: {
12: _lock.Lock();
13: _threadStarted.Set();
14: _threadStop.WaitOne();
15: });
16: _thread.Start();
17: }
18:
19: public void Dispose()
20: {
21: if (_thread != null)
22: {
23: _thread.Abort();
24: }
25: }
26:
27: [Fact(Timeout=1000)]
28: void It_should_be_possible_to_take_lock_when_thread_dies()
29: {
30: _threadStarted.WaitOne();
31: _threadStop.Set();
32: Assert.DoesNotThrow(() => { _lock.Lock(); });
33: }
34: }
And that test leads to the following implementation:
1: public class MutexLock : Lock
2: {
3: private readonly Mutex _lock = new Mutex();
4:
5: public void Lock()
6: {
7: try
8: {
9: _lock.WaitOne();
10: }
11: catch (AbandonedMutexException) {}
12: }
13:
14: public void Unlock()
15: {
16: _lock.ReleaseMutex();
17: }
18: }
Comments
Anonymous
December 19, 2009
Why would you ever want to silently allow another thread to terminate when a lock is held? The underlying data is now in an unknown state; isn't it appropriate to die?Anonymous
December 19, 2009
The comment has been removed