Namespace: System.Threading
Avoiding Collisions:
Collision
may occur while accessing data from multiple threads. Two threads loaded the
same value, updated and set the value at the same time, and leaving the data in
inconsistent state. Interlocked class can perform the arithmetic operations as
single a single operation. These arithmetic operations include: Add, Decrement,
Exchange, Increment, and Read operations.
Synchronization Locks:
C# lock can be used to make single thread enter the specified
code at one time. Like:
lock
(this Or any Object)
{
}
It’s an object base lock. We will face a deadlock, if lock is
not been released for others.
Monitor class is used behind the lock.
Monitor class has the methods like Enter, Exit, TryEnter,
and Wailt.
TryEnter can be used with some timeout to avoid deadlock.
Lock and Monitor does not work across appDomain.
ReaderWriterLock can be used to attain
read or write access to certain resource separately. Multiple readers can read
at one time. But only one reader is allowed at a time. Important properties
include IsReaderLockHeld and IsWriterLockHeld.
AcquireReaderLock, AcquireWriterLock, DownGradeFromWriterLock,
and RealeaseReaderLock, RealeaseWriterLock,
UpgradeToWriterLock are important methods.
Synchronization Lock: With windows
kernel object.
Mutex: Mutex allows you to synchronize
threads across AppDomains and Process boundaries. Mutex inherits from WaitHandle
class. Single property Handle and methods are Close
() and WaitOne().
Mutext m = new Mutex();
If( m.WaitOne(1000,false) ) //wait for a second
{
}
finally
{
m.ReleaseMutex();
}
OR
Try
{ m
= Mutext.OpenExisintg(“ExistingMutexName”);
}
catch(Exception)
{}
if( m== null )
{
m
= new Mutext(false, “ExistingMutexName”);
}
Semaphore:
It provides kernel level some valid
slot against a resource and block access until a slot is available.
Semaphore s = new Semaphore(0,10);
s.Release(5); // Release 5 slots.
Or
Try
{ s
= Semaphore.OpenExisting(“s”); }
Catch(Exception e)
{ s = new Semaphore(0, 10, “S” ); }
Event Class:
To signal threads across AppDomain
and Process boundaries use Event class. This kernel level object has state on
or off. Event types include AutoResetEvent and ManualResetEvent which inherit from EventWaitHandle which inherit from WaitHandle.
(AutoResetEvent, ManualResetEvent) → EventWaitHandle → WaitHandle
AutoResetEvent ar = new
AutoResetEvent(true);
ManualReset mr = new
ManualResetEvent(false);
Ar.Set();
Mr.Reset();
OR
EventWaitHandle awh = null;
Try{
Awh =
EventWaitHandle.OpenExisting(“AWH”);
}
Catch() {}
If(awh == null)
{
awh
= new EventWaitHandle(false, EventResetMode.AutoReset, “AWH”);
}
Comments