Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Choosing between Critical Sections, Mutex and Spin Locks

What are the factors to keep in mind while choosing between Critical Sections, Mutex and Spin Locks? All of them provide for synchronization but are there any specific guidelines on when to use what?

EDIT: I did mean the windows platform as it has a notion of Critical Sections as a synchronization construct.

like image 562
Raam Avatar asked Mar 01 '11 17:03

Raam


2 Answers

In Windows parlance, a critical section is a hybrid between a spin lock and a non-busy wait. It spins for a short time, then--if it hasn't yet grabbed the resource--it sets up an event and waits on it. If contention for the resource is low, the spin lock behavior is usually enough.

Critical Sections are a good choice for a multithreaded program that doesn't need to worry about sharing resources with other processes.

A mutex is a good general-purpose lock. A named mutex can be used to control access among multiple processes. But it's usually a little more expensive to take a mutex than a critical section.

like image 161
Adrian McCarthy Avatar answered Nov 11 '22 15:11

Adrian McCarthy


General points to consider:

  1. The performance cost of using the mechanism.
  2. The complexity introduced by using the mechanism.

In any given situation 1 or 2 may be more important.

E.g.

If you using multi-threading to write a high performance algorithm by making use of many cores and need to guard some data for safe access then 1 is probably very important.

If you have an application where a background thread is used to poll for some information on a timer and on the rare occasion it notices an update you need to guard some data for access then 2 is probably more important than 1.

1 will be down to the underlying implementation and probably scales with the scope of the protection e.g. a lock that is internal to a process is normally faster than a lock across all processes on a machine.

2 is easy to misjudge. First attempts to use locks to write thread safe code will normally miss some cases that lead to a deadlock. A simple deadlock would occur for example if thread A was waiting on a lock held by thread B but thread B was waiting on a lock held by thread A. Surprisingly easy to implement by accident.

On any given platform the naming and qualities of locking mechanisms may vary.

On windows critical sections are fast and process specific, mutexes are slower but cross process. Semaphores offer more complicated use cases. Some problems e.g. allocation from a pool may be solved very efficently using atomic functions rather than locks e.g. on windows InterlockedIncrement which is very fast indeed.

like image 35
morechilli Avatar answered Nov 11 '22 15:11

morechilli