eigenein
eigenein

Reputation: 2200

Monitor.Enter and Monitor.Exit in different threads

Monitor.Enter and Monitor.Exit are designed to be called from the same thread. But, what if I need to release a lock in a different thread than acquired?

For example: there are shared resource and asynchronous operation that uses this resource. The operation begins with BeginOperation and acquires the lock on the shared resource. There also the EndOperation method that releases the lock. EndOperation is typically called in another thread from a callback, thus I can't call Monitor.Exit in the EndOperation method. What is the best approach in this case? Will double-check locking with AutoResetEvent instead of Monitor be a good solution?

Upvotes: 12

Views: 6709

Answers (3)

Yaur
Yaur

Reputation: 7452

The primitive you're looking for is called a semaphore which can be safely entered on one thread and exited from another.

Upvotes: 14

Chris
Chris

Reputation: 2895

Try using a ManualResetEvent, it's used to block thead(s) until some external event has been triggered. MSDN Doc:

http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx

Upvotes: 5

Tudor
Tudor

Reputation: 62439

If you can use .NET 4.0 you can replace it with System.Threading.Semaphore which allows you to acquire permits in one thread and release them in another.

The Semaphore class does not enforce thread identity on calls to WaitOne or Release.

Upvotes: 8

Related Questions