Threads তৈরি এবং Synchronization

Concurrency এবং Parallelism (কনকারেন্সি এবং প্যারালেলিজম) - লিস্প (LISP) - Computer Programming

394

থ্রেডস এবং সিঙ্ক্রোনাইজেশন আধুনিক প্রোগ্রামিংয়ে অনেক গুরুত্বপূর্ণ কনসেপ্ট, বিশেষত মাল্টি-থ্রেডিং ব্যবস্থায়। LISP ভাষায় থ্রেড তৈরি এবং সিঙ্ক্রোনাইজেশন করার জন্য কিছু নির্দিষ্ট প্যাকেজ এবং টুলস রয়েছে, যেমন SBCL (Steel Bank Common Lisp) এবং Clozure CL (Clozure Common Lisp), যেগুলি থ্রেডিং এবং সিঙ্ক্রোনাইজেশনের জন্য প্রয়োজনীয় সরঞ্জাম সরবরাহ করে।

LISP-এ মাল্টি-থ্রেডিং এবং সিঙ্ক্রোনাইজেশন ব্যবহার করে একাধিক থ্রেডের মধ্যে কার্যক্রম ভাগ করা এবং ডেটা এক্সেস নিয়ন্ত্রণ করা সম্ভব।


১. থ্রেডস (Threads) কী?

থ্রেড হল একটি পৃথক একক কার্যকরী একক (execution unit), যা একটি প্রক্রিয়ায় একাধিক কোড অংশ (code segments) চালানোর সুযোগ দেয়। মাল্টি-থ্রেডিং ব্যবহার করে একাধিক কার্যকলাপ (tasks) বা প্রক্রিয়া (process) একসাথে চালানো যেতে পারে। এটি CPU এর ক্ষমতা পূর্ণভাবে ব্যবহার করার জন্য সহায়ক।

LISP-এ থ্রেডিং সাধারণত SBCL বা Clozure CL এর মতো পরিবেশে ব্যবহৃত হয়, যেখানে মাল্টি-থ্রেডিং সমর্থিত।


২. SBCL (Steel Bank Common Lisp) - থ্রেডিং

SBCL LISP-এ থ্রেডিং সমর্থন করে এবং এটি থ্রেড তৈরি এবং পরিচালনা করার জন্য বিভিন্ন টুল সরবরাহ করে।

SBCL-এ থ্রেড তৈরি:

SBCL-এ থ্রেড তৈরি করার জন্য make-thread ফাংশন ব্যবহার করা হয়। থ্রেড তৈরি করার পরে, আপনি থ্রেডে কার্যকলাপ (task) চালানোর জন্য একটি ফাংশন পাস করতে পারেন।

উদাহরণ: SBCL-এ থ্রেড তৈরি

(defun my-thread-function ()
  (format t "Thread started: ~A~%" (get-internal-real-time)))

(defun create-threads ()
  (make-thread #'my-thread-function)
  (make-thread #'my-thread-function))

এখানে, create-threads ফাংশন দুটি থ্রেড তৈরি করে, যা my-thread-function ফাংশনটি চালাবে এবং format ফাংশনের মাধ্যমে কনসোলে একটি বার্তা প্রিন্ট করবে।

থ্রেড চালানো:

(create-threads)

এটি দুটি থ্রেড তৈরি করবে এবং প্রতিটি থ্রেডের মাধ্যমে একটি বার্তা প্রিন্ট হবে।


৩. Clozure CL (CCL) - থ্রেডিং

Clozure CL আরেকটি সাধারণ LISP ডায়ালেক্ট যা থ্রেডিং সমর্থন করে। Clozure CL-এ থ্রেড তৈরি করা এবং পরিচালনা করা হয় ccl:make-thread ফাংশন দিয়ে।

উদাহরণ: Clozure CL-এ থ্রেড তৈরি

(defun my-thread-task ()
  (format t "Hello from the thread!~%"))

(defun create-threads ()
  (ccl:make-thread #'my-thread-task)
  (ccl:make-thread #'my-thread-task))

এখানে, create-threads ফাংশন দুটি থ্রেড তৈরি করবে যা my-thread-task ফাংশনটি চালাবে।

থ্রেড চালানো:

(create-threads)

এটি দুটি থ্রেড তৈরি করবে এবং প্রত্যেকটি থ্রেড একটি বার্তা প্রিন্ট করবে।


৪. থ্রেড সিঙ্ক্রোনাইজেশন

একাধিক থ্রেডের মধ্যে সিঙ্ক্রোনাইজেশন একটি গুরুত্বপূর্ণ বিষয়, বিশেষত যখন একাধিক থ্রেড একে অপরের সাথে শেয়ার করা ডেটা অ্যাক্সেস করে। সিঙ্ক্রোনাইজেশন নিশ্চিত করে যে একসময় কেবল একটি থ্রেড ডেটা অ্যাক্সেস করছে, যাতে রেস কন্ডিশন (race condition) প্রতিরোধ করা যায়।

make-lock এবং lock ফাংশন:

LISP-এ সিঙ্ক্রোনাইজেশন করার জন্য লক (lock) ব্যবহৃত হয়। make-lock ফাংশন একটি লক তৈরি করে এবং lock ফাংশন থ্রেডকে লক করে।

উদাহরণ: SBCL-এ সিঙ্ক্রোনাইজেশন

(defvar *counter* 0)  ; শেয়ার করা ডেটা

(defvar *lock* (make-lock))  ; লক তৈরি করা

(defun increment-counter ()
  (lock *lock*)  ; লক নেওয়া
  (incf *counter*)  ; কনট্রোলের উপর সিঙ্ক্রোনাইজড অপারেশন
  (unlock *lock*))  ; লক মুক্ত করা

(defun create-synchronized-threads ()
  (dotimes (i 5)
    (make-thread #'increment-counter)))  ; ৫টি থ্রেড তৈরি করা

(create-synchronized-threads)
(format t "Final counter value: ~A" *counter*)  ; আউটপুট: 5

এখানে, পাঁচটি থ্রেড একই শেয়ার করা *counter* ভেরিয়েবলের মান বাড়ানোর চেষ্টা করছে। কিন্তু lock এবং unlock ফাংশন ব্যবহার করে সিঙ্ক্রোনাইজেশন নিশ্চিত করা হয়েছে, যাতে শুধুমাত্র একটি থ্রেড একসাথে *counter* পরিবর্তন করতে পারে।

lock এবং unlock এর ব্যাখ্যা:

  • lock: থ্রেড যখন একটি লক নেয়, তখন অন্য থ্রেড সেই লকটি নিতে পারে না যতক্ষণ না প্রথম থ্রেড সেটি মুক্ত না করে।
  • unlock: থ্রেড যখন কাজ শেষ করে, তখন এটি লকটি মুক্ত করে, যাতে অন্য থ্রেড সেটি ব্যবহার করতে পারে।

৫. সিঙ্ক্রোনাইজেশন পদ্ধতি

LISP-এ থ্রেড সিঙ্ক্রোনাইজেশন করার জন্য অন্যান্য পদ্ধতিগুলিও ব্যবহৃত হয়, যেমন:

  • মিউটেক্স (Mutex): একাধিক থ্রেড একসাথে কাজ করলে মিউটেক্স একটি লক হিসেবে ব্যবহৃত হয়, যা একসাথে একাধিক থ্রেডকে একই রিসোর্স অ্যাক্সেস করতে বাধা দেয়।
  • সেমাফোর (Semaphore): একটি থ্রেড সিস্টেমে নির্দিষ্ট সংখ্যক থ্রেড একই সময়ে একই রিসোর্স ব্যবহার করতে পারে, এটি সেমাফোরের মাধ্যমে নিয়ন্ত্রণ করা হয়।

সারসংক্ষেপ

LISP-এ থ্রেডস এবং সিঙ্ক্রোনাইজেশন এর মাধ্যমে আপনি মাল্টি-থ্রেডেড প্রোগ্রাম তৈরি করতে পারেন, যা একাধিক কার্যকলাপ বা প্রক্রিয়া সমান্তরালভাবে পরিচালনা করতে সক্ষম। SBCL এবং Clozure CL এর মতো LISP ডায়ালেক্টে থ্রেড তৈরি এবং সিঙ্ক্রোনাইজেশন পদ্ধতি সমর্থিত:

  1. থ্রেড তৈরি: make-thread ব্যবহার করে থ্রেড তৈরি করা হয়।
  2. থ্রেড সিঙ্ক্রোনাইজেশন: lock, unlock বা অন্যান্য সিঙ্ক্রোনাইজেশন পদ্ধতি ব্যবহার করে থ্রেডের মধ্যে ডেটা অ্যাক্সেস নিয়ন্ত্রণ করা হয়।
  3. রেস কন্ডিশন প্রতিরোধ: সিঙ্ক্রোনাইজেশন নিশ্চিত করে একাধিক থ্রেড একে অপরের শেয়ার করা ডেটা সঠিকভাবে অ্যাক্সেস করতে পারে।

এগুলি মাল্টি-থ্রেডিংয়ের মাধ্যমে কোডের কার্যকারিতা এবং সিঙ্ক্রোনাইজেশন আরও কার্যকরী এবং নির্ভরযোগ্য করতে সাহায্য করে।

Content added By
Promotion

Are you sure to start over?

Loading...