Mutex
মিউটেক্স
পারস্পরিক বর্জনের primitive — একসাথে কেবল একটা thread critical section-এ ঢুকতে পারে। Ownership আছে: যে lock করেছে কেবল সে-ই unlock করতে পারে।
also: mutual exclusion lock, lock
Ownership-ই semaphore-এর সাথে মূল পার্থক্য। একটা binary semaphore দেখতে mutex-এর মতো, কিন্তু যেকোনো thread সেটা release করতে পারে — mutex-এ পারে না।
এই ownership-এর কারণেই mutex-এ priority inheritance সম্ভব: kernel জানে কে lock ধরে আছে, তাই একটা উচ্চ-priority waiter থাকলে holder-এর priority সাময়িকভাবে বাড়িয়ে দেওয়া যায় (Mars Pathfinder-এর সমস্যার সমাধান এটাই ছিল)।
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&m);
/* critical section */
pthread_mutex_unlock(&m);
ভেতরে কী: আধুনিক Linux-এ mutex একটা [[futex]]-এর উপর
বানানো। Uncontended ক্ষেত্রে একটা atomic compare-and-swap —
কোনো syscall নয়, ~২০ ns। কেবল contention হলে
FUTEX_WAIT দিয়ে kernel-এ যায়।
strace -c দিয়ে যাচাই করা যায়: uncontended loop-এ শূন্যটা
futex call।
সাধারণ ভুল: একই thread-এ দুইবার lock করা (deadlock,
যদি না PTHREAD_MUTEX_RECURSIVE), lock ধরে রেখে exception
ছোঁড়া (RAII/defer ব্যবহার করুন), আর lock-এর ক্রম অসামঞ্জস্য
(ABBA deadlock)।