Spinlock
স্পিনলক
এমন lock যা অপেক্ষার সময় ঘুমায় না — একটা loop-এ atomic operation চালিয়ে যায়। Critical section context switch-এর চেয়ে ছোট হলেই কেবল যুক্তিসঙ্গত।
also: busy wait
void lock(atomic_flag *l) {
while (atomic_flag_test_and_set_explicit(l, memory_order_acquire))
__builtin_ia32_pause(); /* PAUSE — CPU-কে ইঙ্গিত */
}
কখন spinlock জেতে: wait-এর প্রত্যাশিত সময় < context switch-এর খরচ (~১–১০ μs)। অর্থাৎ critical section কয়েক ডজন instruction-এর বেশি নয়।
Userspace-এ এটা প্রায় কখনোই সত্য নয় — কারণ scheduler যেকোনো মুহূর্তে lock-ধারী thread-কে preempt করতে পারে, আর তখন spinner পুরো quantum ধরে অর্থহীনভাবে CPU পোড়ায়।
Kernel-এ ভিন্ন গল্প — সেখানে preemption বন্ধ করে spinlock নেওয়া যায়, তাই holder নিশ্চিতভাবে দ্রুত ছাড়বে। এজন্যই Linux kernel-এ spinlock সর্বত্র, কিন্তু glibc-তে নেই।
PAUSE instruction গুরুত্বপূর্ণ — এটা CPU-কে বলে “আমি spin করছি”, যাতে memory order violation-এর pipeline flush এড়ানো যায় আর hyperthread sibling বেশি resource পায়।
বাস্তব সমাধান — adaptive mutex: কিছুক্ষণ spin করো, তারপর
ঘুমাও। glibc-র PTHREAD_MUTEX_ADAPTIVE_NP আর Java-র biased/
adaptive locking এটাই করে।