Foundationপ্রথম নীতি থেকে
LEVEL 4 · Operating Systems

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 poolnসর্বোচ্চ n জন একসাথে
Signalling0একটা thread অন্যটার জন্য অপেক্ষা করে

দ্বিতীয়টাই mutex দিয়ে করা যায় না — কারণ mutex-এ ownership আছে, তাই এক thread lock করে অন্য thread unlock করতে পারে না।

Binary semaphore ≠ mutex। দেখতে এক, কিন্তু:

  • Mutex-এ ownership আছে, semaphore-এ নেই
  • Mutex-এ priority inheritance সম্ভব, semaphore-এ নয়
  • Semaphore signal-safe হতে পারে (sem_post async-signal-safe; pthread_mutex_unlock নয়)

শেষ পয়েন্টটা কাজে লাগে signal handler থেকে একটা thread জাগাতে — যদিও [[signalfd]] সাধারণত ভালো সমাধান।