আমাদের কখন মেটেক্স ব্যবহার করা উচিত এবং কখন সেমফোর ব্যবহার করা উচিত?
আমাদের কখন মেটেক্স ব্যবহার করা উচিত এবং কখন সেমফোর ব্যবহার করা উচিত?
উত্তর:
কখন কী ব্যবহার করবেন তা আমি এখানেই মনে করি -
সেম্যাফোর: যখন আপনি (থ্রেড) ঘুমাতে চান অন্য কোনও থ্রেড আপনাকে জাগ্রত করতে না বলে সেমফোরটি ব্যবহার করুন। সেম্যাফোর 'ডাউন' এক থ্রেডে ঘটে (উত্পাদক) এবং সেম্যাফোর 'আপ' (একই সেমফোরের জন্য) অন্য থ্রেডে ঘটে (যেমন) উত্পাদক-গ্রাহক সমস্যায়, প্রযোজক কমপক্ষে একটি বাফার স্লট খালি না হওয়া পর্যন্ত ঘুমাতে চান - কেবল গ্রাহক থ্রেড বলতে পারে কখন একটি বাফার স্লট খালি থাকে।
নিঃশব্দ: আপনি (থ্রেড) কোড সম্পাদন করতে চান এমন কোনও মিটেক্স ব্যবহার করুন যা একই সময়ে অন্য কোনও থ্রেড দ্বারা সম্পাদন করা উচিত নয়। Mutex 'নিচে' একটি থ্রেড এবং mutex 'আপ' ঘটে আবশ্যক পরে একই থ্রেড ঘটে। উদাহরণস্বরূপ: আপনি যদি কোনও বিশ্বব্যাপী লিঙ্কযুক্ত তালিকা থেকে নোড মুছছেন, আপনি নোডটি মোছার সময় আপনি অন্য পয়েন্টটি পয়েন্ট দিয়ে অন্য থ্রেডটি চান না। আপনি যখন কোনও মিউটেক্স অর্জন করেন এবং নোড মুছতে ব্যস্ত থাকেন, অন্য কোনও থ্রেড যদি একই মুটেক্সটি অর্জন করার চেষ্টা করে তবে আপনি মুটেক্সকে মুক্তি না দেওয়া পর্যন্ত এটি ঘুমিয়ে দেওয়া হবে।
স্পিনলক: আপনি যখন সত্যিই কোনও মিটেক্স ব্যবহার করতে চান তবে একটি স্পিনলক ব্যবহার করুন তবে আপনার থ্রেডটি ঘুমানোর অনুমতি নেই। উদাহরণস্বরূপ: ওএস কার্নেলের মধ্যে একটি বিঘ্নিত হ্যান্ডলার কখনই ঘুমায় না। এটি করলে সিস্টেম হিমায়িত / ক্রাশ হবে। যদি আপনাকে বাধা হ্যান্ডলার থেকে বিশ্বব্যাপী ভাগ করা লিঙ্ক তালিকার কোনও নোড সন্নিবেশ করা প্রয়োজন, একটি স্পিনলক - সন্নিবেশ নোড - রিলিজ স্পিনলক অর্জন করুন।
একটি মিউটেক্স একটি মিউচুয়াল এক্সক্লুশন অবজেক্ট, সেমফোরের অনুরূপ তবে এটি কেবলমাত্র একবারে একটি লকারকে অনুমতি দেয় এবং যার মালিকানা বিধিনিষেধ সেমফোরের চেয়ে আরও কঠোর হতে পারে।
এটিকে একটি সাধারণ গণনা সেমফোরের সমতুল্য হিসাবে বিবেচনা করা যেতে পারে (একটি গণনা সহ) এবং এটি কেবল এটির দ্বারা বন্ধ হওয়া একই থ্রেড দ্বারা মুক্তি দেওয়া যেতে পারে (ক) ।
অন্যদিকে, একটি semaphore একটি স্বেচ্ছাসেবী গণনা আছে এবং একই সাথে বহু লকার দ্বারা লক করা যেতে পারে। এবং এটি দাবি করে না যে এটি একই থ্রেড দ্বারা দাবি করা ছাড়াই মুক্তি পেতে পারে (তবে, যদি না হয়, তবে আপনাকে বর্তমানে সাবধানতার সাথে ট্র্যাক করতে হবে এর জন্য বর্তমানে কার দায়বদ্ধ রয়েছে, অনেকটা বরাদ্দ মেমরির মতো)।
সুতরাং, যদি আপনার কোনও সংস্থার বেশ কয়েকটি উদাহরণ থাকে (তিনটি টেপ ড্রাইভ বলুন), আপনি একটি 3 টি গণনা সহ একটি সেমফোর ব্যবহার করতে পারেন নোট করুন যে এটি আপনাকে জানায় না যে এই টেপ ড্রাইভগুলির মধ্যে আপনার কোনটি রয়েছে, কেবলমাত্র আপনার কাছে একটি নির্দিষ্ট নম্বর।
সেমফোরসের সাহায্যে, কোনও একক লকারের দ্বারা কোনও সংস্থার একাধিক উদাহরণ যেমন টেপ-টু-টেপ অনুলিপি লক করা সম্ভব। আপনার যদি একটি সংস্থান থাকে (কোনও মেমোরি অবস্থান বলুন যা আপনি দূষিত করতে চান না), একটি মিউটেক্স আরও উপযুক্ত।
সমতুল্য ক্রিয়াকলাপগুলি হ'ল:
Counting semaphore Mutual exclusion semaphore
-------------------------- --------------------------
Claim/decrease (P) Lock
Release/increase (V) Unlock
অন্যদিকে : আপনি যদি কখনও সেমফোর দাবী এবং প্রকাশের জন্য ব্যবহৃত উদ্ভট চিঠিগুলি দেখে অবাক হয়ে থাকেন তবে এটি আবিষ্কারক ডাচ ছিলেন because প্রোবের তে ভার্লাজেন মানে চেষ্টা করা এবং হ্রাস করা যখন ভার্জোজেন মানে বৃদ্ধি করা।
(ক) ... অথবা এটি একটি প্রায় সম্পূর্ণ-পৃথক ব্যবহারের কারণে সেমফোর থেকে সম্পূর্ণ পৃথক কিছু হিসাবে বিবেচনা করা যেতে পারে।
এটি বুঝতে খুব গুরুত্বপূর্ণ যে একটি মিউটেক্স 1 টি গণনা সহ কোনও সেমফোর নয় !
বাইনারি সেমফোরসের মতো জিনিস (যা সত্যিকারের গণনা 1 সহ সমুদ্রের অঞ্চল) এর কারণ এখানে রয়েছে।
একটি মুটেক্স এবং একটি বাইনারি-সেমাফোরের মধ্যে পার্থক্য হ'ল মালিকানার মূলনীতি:
একটি মুটেক্স একটি টাস্ক দ্বারা অধিগ্রহণ করা হয় এবং সেইজন্য একই কাজটি দ্বারা তাকে মুক্তি দিতে হবে। এটি বাইনারি সেমফোরসগুলির সাথে বেশ কয়েকটি সমস্যা সংশোধন করা সম্ভব করে (আক্ষরিক রিলিজ, পুনরাবৃত্ত অচলাবস্থা এবং অগ্রাধিকার বিপর্যয়)।
ক্যাভ্যাট: আমি লিখেছিলাম "এটি সম্ভব করে তোলে", যদি ও কীভাবে এই সমস্যাগুলি স্থির করা হয় ওএস বাস্তবায়নের উপর নির্ভর করে।
কারণ একই কাজটি দ্বারা মুটেক্সকে প্রকাশ করতে হবে এটি কার্যের সমন্বয়সাধনের জন্য খুব ভাল নয়। তবে কন্ডিশন ভেরিয়েবলের সাথে একত্রিত হলে আপনি সমস্ত ধরণের আইপিসির আদিম নির্মাণের জন্য খুব শক্তিশালী বিল্ডিং ব্লক পাবেন।
সুতরাং আমার সুপারিশটি হ'ল: যদি আপনি পরিষ্কারভাবে বাস্তবায়িত হয়ে থাকেন তবে মিউটেক্স এবং শর্ত ভেরিয়েবলগুলি (যেমন POSIX pthreads এর সাথে) এগুলি ব্যবহার করে।
আপনি যে সমস্যার সমাধান করতে চাইছেন তার ঠিক ঠিক ফিট হলে সেমফোরগুলি ব্যবহার করুন, অন্যান্য আদিমগুলি তৈরি করার চেষ্টা করবেন না (উদাহরণস্বরূপ সেমোফোরগুলির বাইরে rw-locks, এগুলির জন্য mutexes এবং শর্ত ভেরিয়েবলগুলি ব্যবহার করুন)
প্রচুর ভুল বোঝাবুঝি মিটেক্স এবং সেমোফোর রয়েছে। আমি এখনও অবধি সবচেয়ে ভাল ব্যাখ্যাটি পেয়েছি এই 3-পর্বের নিবন্ধে:
মিটেক্স বনাম সেমোফোরস - পর্ব 1: সেমোফোর্স
মিটেক্স বনাম সেমোফোরস - পার্ট 2: দ্য মেটেক্স
মিটেক্স বনাম সেমোফোর্স - পার্ট 3 (চূড়ান্ত অংশ): পারস্পরিক বাদে সমস্যা
যদিও @opaxdiablo উত্তর সম্পূর্ণ সঠিক তবে আমি এটি উল্লেখ করতে চাই যে উভয় জিনিসের ব্যবহারের পরিস্থিতি একেবারেই আলাদা। মিউটেক্স কোডের অংশগুলি একই সাথে চলমান থেকে রক্ষা করার জন্য ব্যবহৃত হয়, একটি থ্রেডে চালানোর জন্য অন্য থ্রেডকে সিগন্যাল করার জন্য সেমফোরাস ব্যবহার করা হয়।
/* Task 1 */
pthread_mutex_lock(mutex_thing);
// Safely use shared resource
pthread_mutex_unlock(mutex_thing);
/* Task 2 */
pthread_mutex_lock(mutex_thing);
// Safely use shared resource
pthread_mutex_unlock(mutex_thing); // unlock mutex
সেমফোরের দৃশ্যপট আলাদা:
/* Task 1 - Producer */
sema_post(&sem); // Send the signal
/* Task 2 - Consumer */
sema_wait(&sem); // Wait for signal
আরও ব্যাখ্যার জন্য দেখুন http://www.netrino.com/node/202
sema_wait
:-) আমার মতে, তারা উভয় সম্পদ সম্পর্কে এবং অন্যান্য থ্রেডকে দেওয়া বিজ্ঞপ্তিটি একটি পার্শ্ব-প্রতিক্রিয়া (খুব গুরুত্বপূর্ণ, কার্য-বিজ্ঞান) সুরক্ষা.
You say that the usage pattern of semaphores is to notify threads
থ্রেডকে অবহিত করার বিষয়ে একটি বিষয়। আপনি sem_post
সিগন্যাল হ্যান্ডলার থেকে নিরাপদে কল করতে পারেন ( pubs.opengroup.org/onlinepubs/009695399/function/… ) তবে এটি কল করা pthread_mutex_lock
এবং pthread_mutex_unlock
সিগন্যাল হ্যান্ডেলারদের থেকে পুনরুদ্ধার করা হয়নি ( manpages.ubuntu.com/manpages/lucid/man3/… )
"টয়লেট উদাহরণ" দেখুন - http://pheatt.emporia.edu/courses/2010/cs557f10/hand07/ Mutex % 20vs_ % 20Semaphore.htm :
mutex:
একটি টয়লেট জন্য চাবি। একটি ব্যক্তির চাবিটি থাকতে পারে - টয়লেটটি দখল করুন - সময়ে। শেষ হয়ে গেলে, ব্যক্তিটি কাতারে থাকা পরবর্তী ব্যক্তিকে চাবি (মুক্ত করে) দেয়।
আনুষ্ঠানিকভাবে: "মুটেক্সগুলি সাধারণত পুনরায় প্রবেশকারী কোডের একটি অংশে অ্যাক্সেস সিরিয়াল করতে ব্যবহৃত হয় যা একাধিক থ্রেড দ্বারা একই সাথে সম্পাদন করা যায় না A এই বিভাগটি থেকে প্রথম থ্রেডটি বের না হওয়া অবধি অপেক্ষা করতে হবে। রেফ: সিম্বিয়ান বিকাশকারী গ্রন্থাগার
(একটি মিউটেক্সটি সত্যই 1 মান সহ একটি সেমফোর))
সেমফোর্:
বিনামূল্যে অভিন্ন শৌচাগার কীগুলির সংখ্যা। উদাহরণস্বরূপ, বলুন যে আমাদের কাছে অভিন্ন লক এবং কী সহ চারটি টয়লেট রয়েছে। সেমফোর গণনা - কীগুলির গণনা - শুরুতে 4 এ সেট করা হয় (চারটি টয়লেট বিনামূল্যে) তখন লোকেরা আসার সাথে সাথে গণনা মান হ্রাস পাবে all যদি সমস্ত টয়লেট পূর্ণ হয়, অর্থাত্। কোনও নিখরচায় কী নেই, সেমফোর গণনা 0 এখন e এক ব্যক্তি টয়লেট ছেড়ে দেয়, সেমফোর 1 টি (একটি ফ্রি কী) এ উন্নীত হয় এবং পরের ব্যক্তিকে সারিতে দেওয়া হয়।
আনুষ্ঠানিকভাবে: "একটি সেম্যাফোর একটি শেয়ার্ড রিসোর্সের যুগপত ব্যবহারকারীর সংখ্যা সর্বাধিক সংখ্যক পর্যন্ত সীমাবদ্ধ করে দেয় read " রেফ: সিম্বিয়ান বিকাশকারী গ্রন্থাগার
ঝাঁকুনির শব্দ না করার চেষ্টা করছি, কিন্তু নিজেকে সাহায্য করতে পারে না।
আপনার প্রশ্নটি হওয়া উচিত যে মুটেক্স এবং সেমফোরের মধ্যে পার্থক্য কী? এবং আরও সুনির্দিষ্ট প্রশ্ন হওয়া উচিত, 'মিটেক্স এবং সেমোফোরগুলির মধ্যে সম্পর্ক কী?'
(আমি এই প্রশ্নটি যুক্ত করে দিতাম তবে আমি শতভাগ নিশ্চিত যে কিছু অতিমাত্রায় মডারেটর পার্থক্য এবং সম্পর্কের পার্থক্য না বুঝে এটি সদৃশ হিসাবে বন্ধ করে দেবে।)
বস্তুর পরিভাষায় আমরা এটি পর্যবেক্ষণ করতে পারি:
পর্যবেক্ষণ ১। সেমফোরে মিটেক্স রয়েছে
পর্যবেক্ষণ ২.উত্তেজকৃতটি সেমফোর নয় এবং সেম্যাফোরটি মিটেক্স নয়।
কিছু সেমোফোর রয়েছে যেগুলি মেটেক্স হিসাবে বাইনারি সেমোফোরস হিসাবে পরিচিত এমনভাবে কাজ করবে, তবে তারা নন মুটেক্সকে ফ্র্যাক করছে।
সিগন্যালিং নামক একটি বিশেষ উপাদান রয়েছে (পিক্সিক্সটি সেই নামের জন্য শর্ত_সীমা পরিবর্তনযোগ্য ব্যবহার করে), ম্বেটেক্সের বাইরে একটি সেমফোর তৈরি করতে প্রয়োজনীয়। এটিকে একটি বিজ্ঞপ্তি-উত্স হিসাবে ভাবেন। যদি দুটি বা ততোধিক থ্রেড একই নোটিফিকেশন-উত্সটিতে সাবস্ক্রাইব হয় তবে তাদের জাগ্রত করার জন্য কোনও এক বা সমস্তের কাছে বার্তা পাঠানো সম্ভব।
সেমফোরসের সাথে যুক্ত এক বা একাধিক কাউন্টার থাকতে পারে, যা মুটেক্স দ্বারা রক্ষিত। Semaphore এর জন্য সবচেয়ে সর্বাধিক দৃশ্যপট, এখানে একটি একক কাউন্টার রয়েছে যা 0 বা 1 হতে পারে।
এখানেই বর্ষার বৃষ্টির মতো বিভ্রান্তি .ুকে পড়ে।
কাউন্টার সহ একটি সেমফোর যা 0 বা 1 হতে পারে মুটেক্স নয়।
মুটেক্সের দুটি রাজ্য (0,1) এবং একটি মালিকানা (টাস্ক) রয়েছে। সেমাফোরে একটি মিটেক্স, কিছু কাউন্টার এবং একটি শর্ত ভেরিয়েবল রয়েছে।
এখন, আপনার কল্পনা এবং কাউন্টার ব্যবহারের প্রতিটি সংমিশ্রণ এবং কখন সিগন্যাল ব্যবহার করুন সেমফোর এক ধরণের তৈরি করতে পারে।
0 বা 1 মানের সাথে একক কাউন্টার এবং যখন মান 1 এ যায় এবং সিগন্যাল দেয় তখন সিগন্যালের অপেক্ষায় থাকা একজনকে আনলক করে == বাইনারি সেমফোর
মান 0 থেকে N এর সাথে একক কাউন্টার এবং মান N এর চেয়ে কমতে গেলে সিগন্যাল দেয় এবং মানগুলি N == হয় যখন সেমফোর গণনা করা হয় / লক করে / অপেক্ষা করে
মান 0 থেকে N এর সাথে একক কাউন্টার এবং মান যখন N তে যায় তখন সিগন্যাল করে, এবং মানগুলি N == ব্যারিয়ার সেমফোরের চেয়ে কম হলে লক / অপেক্ষায় থাকে (ভাল তারা যদি এটি কল না করে তবে তাদের উচিত))
এখন আপনার প্রশ্নের কাছে, কখন কী ব্যবহার করবেন। (অথবা পরিবর্তে প্রশ্ন সংস্করণ ৩. সঠিক করুন যখন কখন মুটেক্স ব্যবহার করবেন এবং কখন বাইনারি-সেম্যাফোর ব্যবহার করবেন, যেহেতু নন-বাইনারি-সেম্যাফোরের তুলনা নেই)) আপনি যখন একটি কাস্টমাইজড আচরণ চান, তখন বাইনারি দ্বারা সরবরাহ করা হয়নি সেম্যাফোর, যেমন স্পিন-লক বা দ্রুত-লক বা পুনরাবৃত্ত-লকগুলি। আপনি সাধারণত গুণাবলীর সাথে মিটেক্সগুলি কাস্টমাইজ করতে পারেন তবে সেমফোরটি কাস্টমাইজ করা নতুন সেমফোর লেখার কিছুই নয়। 2. আপনি হালকা বা দ্রুততম আদিম চান want
যখন আপনি যা চান ঠিক তা এর দ্বারা সরবরাহ করা হয়, যখন সেমোফোরগুলি ব্যবহার করুন।
আপনি যদি বাইনারি-সেমোফোর প্রয়োগের মাধ্যমে কী সরবরাহ করা হচ্ছে তা যদি বুঝতে না চান তবে আইএমএইচও, মিটেক্স ব্যবহার করুন।
এবং সর্বশেষে কেবলমাত্র এস.ও. এর উপর নির্ভর না করে কোনও বই পড়ুন।
আমি মনে করি প্রশ্নটি মুটেক্স এবং বাইনারি সেমফোরের মধ্যে পার্থক্য হওয়া উচিত।
মিটেক্স = এটি একটি মালিকানা লক প্রক্রিয়া, কেবল থ্রেড যারা লকটি অর্জন করে তারা লকটি মুক্তি দিতে পারে।
বাইনারি Semaphore = এটি একটি সংকেত প্রক্রিয়া বেশি, অন্য যে কোনও উচ্চতর অগ্রাধিকার থ্রেড চাইলে সংকেত দিতে পারে এবং লকটি নিতে পারে।
মিটেক্সটি ভাগ করা সংস্থানগুলি রক্ষা করা।
সেম্যাফোরটি থ্রেডগুলি প্রেরণ করা।
মেকেক্স:
কল্পনা করুন যে বিক্রি করার জন্য কিছু টিকিট রয়েছে। আমরা এমন একটি ক্ষেত্রে অনুকরণ করতে পারি যেখানে একই সাথে অনেক লোক টিকিট কিনে থাকে: প্রতিটি ব্যক্তি টিকিট কেনার জন্য একটি থ্রেড। স্পষ্টতই আমাদের টিকিটগুলি সুরক্ষিত করার জন্য মিউটেক্স ব্যবহার করা প্রয়োজন কারণ এটি ভাগ করা সংস্থান।
সেমফোর:
কল্পনা করুন যে নীচের মতো আমাদের একটি গণনা করা দরকার:
c = a + b;
এছাড়াও, আমরা একটি ফাংশন প্রয়োজন geta()
নিরূপণ করা a
একটি ফাংশন, getb()
গণনা করতে b
এবং একটি ফাংশন getc()
গণনা করতে c = a + b
।
একথাও ঠিক যে, আমরা করতে পারবো না c = a + b
যদি না geta()
এবং getb()
সমাপ্ত করা হয়েছে।
তিনটি ফাংশন যদি তিনটি থ্রেড হয় তবে আমাদের তিনটি থ্রেড প্রেরণ করতে হবে।
int a, b, c;
void geta()
{
a = calculatea();
semaphore_increase();
}
void getb()
{
b = calculateb();
semaphore_increase();
}
void getc()
{
semaphore_decrease();
semaphore_decrease();
c = a + b;
}
t1 = thread_create(geta);
t2 = thread_create(getb);
t3 = thread_create(getc);
thread_join(t3);
সেমফোরের সাহায্যে উপরের কোডটি নিশ্চিত করতে পারে যে এটি t3
তার কাজটি অবিরতভাবে করবে না t1
এবং t2
তাদের কাজগুলি করেছে।
এক কথায়, সেমফোরটি থ্রেডগুলিকে একটি যুক্তিযুক্ত ক্রম হিসাবে চালিত করা হয় যেখানে মিটেক্সটি ভাগ করা সংস্থানগুলি রক্ষা করে।
তাই তারা একই জিনিস নয় এমনকি কিছু লোক যদি সর্বদা বলে থাকে যে মুটেক্স প্রাথমিক মান 1 সহ একটি বিশেষ সেমফোর You আপনি এটিও বলতে পারেন তবে দয়া করে লক্ষ্য করুন যে সেগুলি বিভিন্ন ক্ষেত্রে ব্যবহৃত হয়। আপনি এটি করতে পারলেও একে অপরের দ্বারা প্রতিস্থাপন করবেন না।
x = getx(); y = gety(); z = x + y;
কিছু কারণে আমরা তিনটি থ্রেড ব্যবহার করে তিনটি জিনিস করলাম, এখন থ্রেডগুলির ক্রমটি খুব গুরুত্বপূর্ণ কারণ আমরা শেষ করতে না পারলে এবং x + y
না শেষ করতে পারি । এক কথায়, যখন আমরা মাল্টি-থ্রেডিং কার্যকর করার ক্রমটি যত্ন করি তখন সেমফোর ব্যবহৃত হয়। getx
gety
x
এবং অপেক্ষা y
সমাপ্ত হওয়া অবধি অপেক্ষা করুন , তারপরে গণনা করুন z = x + y
। আমি জানি জাভা আছে CyclicBarrier
। এছাড়াও, আমি নিশ্চিত না যে আমি বলতে পারি mapreduce
সেমফোর ইউজকেসগুলিও খুব বেশি, কারণ reduce
যতক্ষণ না সবগুলি map
সম্পন্ন হয়।
উপরের সমস্ত উত্তর ভাল মানের, তবে এটি কেবল মুখস্থ করার জন্য Mu মুটেক্স নামটি মিউচুয়াল এক্সক্লুসিভ থেকে উদ্ভূত হয়েছে তাই আপনি একটি মুকেক্স লকটিকে মিউচুয়াল এক্সক্লুসিভ হিসাবে দু'জনের মধ্যে একবারে কেবল একটি হিসাবে বিবেচনা করতে উদ্বুদ্ধ হন এবং যদি আমি আমি এটি ছেড়ে দেয়ার পরেই এটি আপনার কাছে থাকতে পারে the অন্যদিকে সেমফোরের জন্য এ জাতীয় কেসটির অস্তিত্বই নেই ট্র্যাফিক সিগন্যালের মতো (যার অর্থ সেমফোর শব্দের অর্থও)।
যেমনটি উল্লেখ করা হয়েছিল, একটির একটি গণনা সহ একটি সেমফোর একটি 'বাইনারি' সেমফোর হিসাবে একই জিনিস যা মুটেক্সের মতো একই জিনিস।
আমি যেগুলির জন্য একটি বৃহত্তর গণনা সহ سيمফোরগুলি দেখেছি তার জন্য প্রধান ব্যবহৃতগুলি হ'ল উত্পাদক / ভোক্তা পরিস্থিতি যেখানে আপনার নির্দিষ্ট নির্দিষ্ট আকারের সারি রয়েছে।
আপনার তখন দুটি সেমফোর রয়েছে। প্রথম সেম্যাফোরটি প্রাথমিকভাবে কাতারে আইটেমের সংখ্যা হিসাবে সেট করা হয় এবং দ্বিতীয় সেমফোর 0 তে সেট করা হয় The উত্পাদক প্রথম সেম্যাফোরে একটি পি অপারেশন করেন, সারি যুক্ত করে। এবং দ্বিতীয়টিতে একটি ভি অপারেশন করে। ভোক্তা দ্বিতীয় সেমফোরে পি অপারেশন করে, সারি থেকে সরিয়ে দেয় এবং তারপরে প্রথমে একটি ভি অপারেশন করে।
এইভাবে প্রযোজক যখনই সারি পূরণ করে তখন অবরুদ্ধ হয়ে থাকে এবং যখনই সারিটি খালি থাকে তখন গ্রাহককে অবরুদ্ধ করা হয়।
একটি মিউটেক্স একটি সেমফোরের একটি বিশেষ ক্ষেত্রে। একটি সেমফোর বেশ কয়েকটি থ্রেডকে সমালোচনামূলক বিভাগে যেতে দেয়। একটি সেমফোর তৈরি করার সময় আপনি সংজ্ঞায়িত করেন যে কীভাবে সমালোচনামূলক বিভাগে থ্রেডগুলি অনুমোদিত হতে পারে। অবশ্যই আপনার কোডটি এই সমালোচনামূলক বিভাগে বেশ কয়েকটি অ্যাক্সেস পরিচালনা করতে সক্ষম হতে হবে।
বাইনারি semaphore এবং Mutex পৃথক। ওএস দৃষ্টিকোণ থেকে, একটি বাইনারি সেম্যাফোর এবং গণনা সেমফোর একই পদ্ধতিতে প্রয়োগ করা হয় এবং বাইনারি সেম্যাফোরের মান 0 বা 1 হতে পারে।
Mutex -> কোডের একটি সমালোচনামূলক বিভাগের জন্য কেবলমাত্র পারস্পরিক বর্জনের একমাত্র উদ্দেশ্যে ব্যবহার করা যেতে পারে।
সেমফোর -> বিভিন্ন ধরণের সমস্যা সমাধানে ব্যবহার করা যেতে পারে। একটি বাইনারি semaphore সিগন্যাল জন্য এবং পারস্পরিক বর্জন সমস্যা সমাধানের জন্য ব্যবহার করা যেতে পারে। 0-এ শুরু করা হলে , এটি সংকেত সমস্যা সমাধান করে এবং 1-এ শুরু করা হলে , এটি পারস্পরিক বর্জনীয় সমস্যা সমাধান করে ।
যখন সংস্থানগুলির সংখ্যার পরিমাণ বেশি হয় এবং সিঙ্ক্রোনাইজ করার দরকার হয় তখন আমরা গণনা সেমফোরটি ব্যবহার করতে পারি।
আমার ব্লগে আমি এই বিষয়গুলি বিস্তারিতভাবে আলোচনা করেছি।
https://designpatterns-oo-cplusplus.blogspot.com/2015/07/synchronization-primitives-mutex-and.html