Semaphore
সেমাফোর
একটা atomic counter সহ দুইটা operation — wait (কমাও, শূন্য হলে অপেক্ষা করো) আর post (বাড়াও)। Mutex-এর বিপরীতে কোনো ownership নেই, তাই thread-এর মধ্যে signalling-এ ব্যবহার করা যায়।
also: counting semaphore
Dijkstra-র মূল নাম দুটো: P (proberen, wait) আর V (verhogen, post)।
sem_t s;
sem_init(&s, 0, 3); /* একসাথে ৩ জন ঢুকতে পারবে */
sem_wait(&s); /* counter কমাও, ০ হলে block */
/* ... */
sem_post(&s); /* counter বাড়াও, একজনকে জাগাও */
দুইটা ব্যবহার:
| প্যাটার্ন | initial count | কাজ |
|---|---|---|
| Resource pool | n | সর্বোচ্চ n জন একসাথে |
| Signalling | 0 | একটা thread অন্যটার জন্য অপেক্ষা করে |
দ্বিতীয়টাই mutex দিয়ে করা যায় না — কারণ mutex-এ ownership আছে, তাই এক thread lock করে অন্য thread unlock করতে পারে না।
Binary semaphore ≠ mutex। দেখতে এক, কিন্তু:
- Mutex-এ ownership আছে, semaphore-এ নেই
- Mutex-এ priority inheritance সম্ভব, semaphore-এ নয়
- Semaphore signal-safe হতে পারে (
sem_postasync-signal-safe;pthread_mutex_unlockনয়)
শেষ পয়েন্টটা কাজে লাগে signal handler থেকে একটা thread জাগাতে — যদিও [[signalfd]] সাধারণত ভালো সমাধান।