Semaphore class is a counting semaphore.
That means that it has two main methods:
acquire(), release()
The counting semaphore is initialized with a given number of "permits". For each call to acquire() a permit is taken by the calling thread. For each call to release() a permit is returned to the semaphore. Thus, at most N threads can pass the acquire() method without any release() calls, where N is the number of permits the semaphore was initialized with. The permits are just a simple counter. Nothing fancy here.
Semaphore Usage: As semaphore typically have two uses:
Guarding Critical Sections: If you use a
semaphore to guard a critical section, the thread trying to enter the critical
section will typically first try to acquire a permit, enter the critical
section, and then release the permit again after
Sending Signals Between Threads: If you
use a semaphore to send signals between threads, then you would typically have
one thread call the acquire() method, and the other thread to call the
release() method.
Fairness: No guarantees are made about fairness of
the threads acquiring permits from the Semaphore i.e. there is no guarantee
that the first thread to call acquire() is also the first thread to obtain a
permit. If the first thread is blocked waiting for a permit, then a second
thread checking for a permit just as a permit is released, may actually obtain
the permit ahead of thread
1.If you want to enforce fairness, the Semaphore class has a constructor that takes a boolean telling if the semaphore should enforce fairness. Enforcing fairness comes at a performance / concurrency penalty, so don't enable it unless you need it.
No comments:
Post a Comment