A semaphore is a synchronization mechanism used in computer science and operating system theory to control access to shared resources in a parallel or distributed system. Semaphores are particularly useful for avoiding race conditions and deadlocks.
Types of Semaphores:
- Binary Semaphore: Also known as a "mutex" (mutual exclusion), it can only take values 0 and 1. It is used to control access to a resource by exactly one process or thread.
- Counting Semaphore: Can take a non-negative integer value and allows access to a specific number of concurrent resources.
How It Works:
- Semaphore Value: The semaphore has a counter that represents the number of available resources.
- If the counter is greater than zero, a process can use the resource, and the counter is decremented.
- If the counter is zero, the process must wait until a resource is released.
Operations:
- wait (P-operation, Proberen, "to test"):
- Checks if the counter is greater than zero.
- If so, it decrements the counter and allows the process to proceed.
- If not, the process blocks until the counter is greater than zero.
- signal (V-operation, Verhogen, "to increment"):
- Increments the counter.
- If processes are waiting, this operation wakes one of the waiting processes so it can use the resource.
Example:
Suppose we have a resource that can be used by multiple threads. A semaphore can protect this resource:
// PHP example using semaphores (pthreads extension required)
class SemaphoreExample {
private $semaphore;
public function __construct($initial) {
$this->semaphore = sem_get(ftok(__FILE__, 'a'), $initial);
}
public function wait() {
sem_acquire($this->semaphore);
}
public function signal() {
sem_release($this->semaphore);
}
}
// Main program
$sem = new SemaphoreExample(1); // Binary semaphore
$sem->wait(); // Enter critical section
// Access shared resource
$sem->signal(); // Leave critical section
Applications:
- Access Control: Controlling access to shared resources like databases, files, or memory areas.
- Thread Synchronization: Ensuring that certain sections of code are not executed concurrently by multiple threads.
- Enforcing Order: Coordinating the execution of processes or threads in a specific order.
Semaphores are a powerful tool for making parallel programming safer and more controllable by helping to solve synchronization problems.