সিরিজ: Thread Synchronization

🧵 Thread Synchronization: একি ডেটা একাধিক থ্রেডে, সমস্যা কোথায়?
আমরা জানি, একটি প্রোগ্রামের ভেতরে একাধিক থ্রেড তৈরি হতে পারে। এই থ্রেডগুলো একে অপরের সাথে সমান্তরালভাবে চলতে পারে, অর্থাৎ একই সময়ে একাধিক কাজ একসাথে করতে পারে। কিন্তু সমস্যার শুরু তখনই যখন একাধিক থ্রেড একসাথে একই ডেটার উপর কাজ করতে চায়।
একটু বাস্তব উদাহরণে আসা যাক — ধরুণ, একটি ব্যাংকের সিস্টেমে একটি অ্যাকাউন্ট আছে, যার ব্যালেন্স ১০০০ টাকা। এখন দুইজন কাস্টমার একই সময়ে ওই অ্যাকাউন্ট থেকে টাকা তুলছে — একজন ৭০০ টাকা, আরেকজন ৫০০ টাকা। যদি একই সময়ে দুই থ্রেড কাজ করে এবং উপযুক্ত সমন্বয় না থাকে, তাহলে শেষ ব্যালেন্স -২০০ টাকা দেখাবে! অথচ বাস্তবে তো এমন হওয়া সম্ভব না। এই অবস্থাকেই বলা হয় Race Condition।
❗Thread Synchronization না থাকলে কী কী সমস্যা হতে পারে?
১. 🏁 Race Condition
যখন একাধিক থ্রেড একই সময় একই ডেটার উপর কাজ করে এবং কে আগে শেষ করবে সেটা নির্ভর করে CPU scheduling এর উপর — তখনই হয় এই অবস্থাকে বলা হয় Race Condition। এতে ডেটা ভুল হয়ে যায় হয়ে যেতে পারে, কারণ যে থ্রেড পরে আসার কথা, সে আগে রেজাল্ট লিখে ফেলতে পারে।
২. 🔄 Inconsistent বা Corrupted Data
ডেটা এমন একটা অবস্থায় যেতে পারে যা বাস্তবে সম্ভব না। যেমন — টাকা না থাকতেও উইথড্র হয়ে যাওয়া, স্টক না থাকতেও প্রোডাক্ট সেল হয়ে যাওয়া ইত্যাদি।
৩. 🔃 Unpredictable Behavior
একই কোড বারবার রান করলেও কখনো ঠিক ভাবে কাজ করে, আবার কখনো করে না। এ অবস্থায় ডিবাগ করা কষ্টকর হয়ে পড়ে, কারণ ইস্যুগুলো ঘটছে “সময়ে সময়ে” যেখানে প্রগ্রামারের কোনো কন্ট্রোল থাকে নাহ।
🧩 তাহলে সমাধান কী?
এই সমস্যাগুলোর সমাধান করার জন্যই প্রয়োজন Thread Synchronization। এর মূল লক্ষ্য হলো — যখন একটি থ্রেড কোনো শেয়ারড ডেটা নিয়ে কাজ করছে, তখন অন্য থ্রেড যেন সেখানে হস্তক্ষেপ না করতে পারে।
অর্থাৎ, Thread Synchronization মানে হচ্ছে — একাধিক থ্রেড যখন কোনো শেয়ার করা রিসোর্সে (যেমন: ভ্যারিয়েবল, অবজেক্ট, মেমোরি) কাজ করে, তখন কে কখন কাজ করবে সেটার সঠিক সমন্বয় করে দেওয়া।
এই সমন্বয়ের মাধ্যমে আমরা Data Consistency নিশ্চিত করতে পারি, এবং Race Condition এড়াই।
🔐 Synchronization টুলস ও কৌশল
১. Mutex (Mutual Exclusion)
Mutex এমন এক ধরনের লক যেটি এক সময়ে কেবল একটি থ্রেডকেই ডেটার উপর এক্সেস দেয়। যখন থ্রেড কাজ শেষ করে, তখন সে Mutex খুলে দেয় — যেন অন্য কেউ এক্সেস নিতে পারে।
🛠 উদাহরণ: ব্যাংকের টাকার ট্রান্সফার — এক থ্রেড যখন ব্যালেন্স আপডেট করছে, তখন অন্যরা অপেক্ষা করে।
২. Lock / Unlock Mechanism
প্রোগ্রামিং ভাষাগুলোতে সাধারণত lock()
ও unlock()
মেথড থাকে — এর মাধ্যমে কোন ব্লক অফ কোডকে সুরক্ষিত (critical section) করা যায়। Lock ও Mutex প্রায় একই, তবে Lock সাধারণত বেশি ফিচারসাপোর্ট করে।
৩. Semaphore
এটি একটি কাউন্টার ভিত্তিক Synchronization টুল। Semaphore তুলনামূলকভাবে অ্যাডভান্সড — এটি নির্দিষ্ট সংখ্যক থ্রেডকে একসাথে অ্যাকসেস করার অনুমতি দেয়। Binary Semaphore (0/1) অনেকটাই Mutex এর মত কাজ করে।
৪. Monitor
Monitor এমন একটা কাঠামো যা ডেটা এবং Synchronization মেথড একসাথে ম্যানেজ করে। Monitor হলো synchronized block বা method ব্যবহার করে ক্রিটিকাল সেকশনকে রক্ষা করা। অনেক হাই-লেভেল ভাষা (যেমন Java, Go) এর মধ্যে ডিফল্টভাবে Monitor থাকে।
🧠 বাস্তব উদাহরণ দিয়ে বোঝা যাক
একটি টিকিট বুকিং সিস্টেম কল্পনা করুন — যেখানে ১টি মাত্র টিকিট বাকি। দুইজন ইউজার একই সময়ে বুক করতে চায়। যদি Synchronization না থাকে, তাহলে দুজনেরই বুকিং Successful দেখাবে। কিন্তু পরে দেখা যাবে, সিট তো একটা!
এটা শুধু বাগ না, বরং বাস্তবে বিপদজনক ফলাফল বয়ে আনতে পারে। এর সমাধান হলো: বুকিং এর সময় সিস্টেম চেক করবে কেউ বুক করছে কিনা (Lock) — যদি না করে, তাহলে Proceed করবে।
⚠️ Synchronization করলেই কি সব সমস্যা মিটে যাবে?
না। Synchronization সঠিকভাবে না করলে Dead-lock বা Live-lock এর মত বড় সমস্যা হয়।
🕳️ Dead-lock
যখন দুটি থ্রেড একে অপরের লক পাওয়া পর্যন্ত অপেক্ষা করে — কিন্তু কেউই ছাড়ে না। তখন দুই থ্রেডই চিরদিনের মতো আটকে যায়
🔁 Live-lock
দুই থ্রেড পরস্পরকে সম্মান জানাতে জানাতে এমন এক জায়গায় পৌঁছে যায়, যেখানে কেউই কাজ এগিয়ে নিতে পারে না। দুজনই একে অপরের পথ ছেড়ে দেয়, কিন্তু শেষ পর্যন্ত দাঁড়িয়ে থাকে।
🔚 সর্বশেষ
Thread Synchronization হলো Multi-threaded প্রোগ্রামিংয়ের একটি অপরিহার্য অংশ। এটা ছাড়া Race Condition, Data Corruption আর অনিশ্চিত আচরণ বারবার ঘটবে। সঠিক Synchronization ব্যবহার করলে প্রোগ্রাম হবে নির্ভরযোগ্য, নিরাপদ এবং ভবিষ্যৎ-প্রস্তুত।
আমরা তো শুধু efficiency চাই না, চাই correctness — তাই Synchronization ছাড়া কোনো থ্রেডিং সিস্টেম পূর্ণাঙ্গ হয় না।
🖊️ আল হাসিব
📅 চ্যালেঞ্জ: ৩০ দিনে ৩০টি ব্লগ পোস্ট
📂 বিষয়: Thread Synchronization, Execution Model, Operating System
Subscribe to my newsletter
Read articles from AL Hasib directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
