বাইনারি সেমফোর এবং মিটেক্সের মধ্যে পার্থক্য


819

বাইনারি semaphore এবং mutex মধ্যে কোন পার্থক্য আছে বা সেগুলি মূলত একই?


11
এগুলি অর্থহীনভাবে একই, তবে অনুশীলনে আপনি অদ্ভুত পার্থক্য লক্ষ্য করবেন (বিশেষত উইন্ডোজে)।
মাইকেল ফুকারাকিস

5
@ মিশেল ফৌকারকিস: আজব পার্থক্য কী?
ফিলিপ

2
আমি মনে করি অদ্ভুত সঠিক প্রকাশ ছিল না। একটি মিউটেক্স মালিকানা এবং কখনও কখনও পুনরায় প্রবেশের পক্ষেও সমর্থন করে। উইন্ডোজের ক্ষেত্রেও এটিই ঘটে। এছাড়াও, উইন্ডোজের সেমফোরগুলি ইভেন্ট অবজেক্টগুলির শীর্ষে প্রয়োগ করা হয়, তবে আমি এর ব্যবহারিক প্রভাব সম্পর্কে নিশ্চিত নই।
মাইকেল ফুকারাকিস


2
@ ফিলিপ্সি নিসলি 'মি' এর জায়গায় 'আরএন' লুকিয়েছিল।
মুনক্র্রেটার

উত্তর:


691

এইগুলি হল না একই জিনিস। এগুলি বিভিন্ন কাজে ব্যবহৃত হয়!
উভয় প্রকারের সেমফোরের সম্পূর্ণ / খালি অবস্থা রয়েছে এবং একই API ব্যবহার করা হয়, তবে তাদের ব্যবহার খুব আলাদা।

মিউচুয়াল এক্সক্লুশন সেম্যাফোরস
মিউচুয়াল এক্সক্লুশন সেমোফোরগুলি শেয়ারড রিসোর্সগুলি (ডেটা স্ট্রাকচার, ফাইল ইত্যাদি) রক্ষা করতে ব্যবহৃত হয়।

একটি Mutex semaphore এটি গ্রহণ করে এমন কাজটির দ্বারা "মালিকানাধীন"। যদি টাস্ক বি বর্তমানে টাস্ক এ দ্বারা আটকানো একটি মিটেক্সকে সেমজিভ করার চেষ্টা করে, টাস্ক বি এর কল একটি ত্রুটি ফিরিয়ে দেবে এবং ব্যর্থ হবে।

নিঃশব্দ সবসময় নিম্নলিখিত ক্রম ব্যবহার করে:

  - সেমটেক
  - জটিল অংশ
  - সেমজিভ

এখানে একটি সহজ উদাহরণ:

  থ্রেড একটি থ্রেড খ
   মুটেক্স নিন
     অ্যাক্সেস ডেটা
     ... Mutex নিন <== অবরুদ্ধ করবে
     ...
   Mutex অ্যাক্সেস ডেটা দিন <== অবরোধ মুক্ত করুন
                                  ...
                                মিটেক্স দিন

বাইনারি সেম্যাফোর
বাইনারি সেম্যাফোর একেবারে পৃথক প্রশ্নের ঠিকানা দেয়:

  • টাস্ক বি কিছু হওয়ার জন্য অপেক্ষা করছে (উদাহরণস্বরূপ একটি সেন্সর ছিন্ন করা হচ্ছে)।
  • সেন্সর ট্রিপস এবং একটি বিঘ্নিত পরিষেবার রুটিন চলে। এটি ভ্রমণের কোনও কাজকে অবহিত করা দরকার।
  • টাস্ক বি চালানো উচিত এবং সেন্সর ভ্রমণের জন্য উপযুক্ত পদক্ষেপ নেওয়া উচিত। তারপরে অপেক্ষা করতে ফিরে যান।

   Task A                      Task B
   ...                         Take BinSemaphore   <== wait for something
   Do Something Noteworthy
   Give BinSemaphore           do something    <== unblocks

নোট করুন যে বাইনারি সেম্যাফোর সহ, বি এর পক্ষে সেমফোর নেওয়া ঠিক আছে এবং এটিকে এটি দেওয়া হবে।
আবার, একটি বাইনারি সেমফোর কোনও সংস্থান অ্যাক্সেস থেকে রক্ষা করছে না। গ্রাহক দেওয়া এবং সেমফোর গ্রহণের কাজটি মূলত উদ্দীপ্ত হয়।
এটি একই বাইনারি semaphore একটি উপহার এবং একটি গ্রহণ তাই একই টাস্ক জন্য সামান্য জ্ঞান করে।


12
তখন কোনও বাইনারি সেমফোরের চেয়ে কোনও মুটেক্স ভাল না? যেহেতু কেউ যদি এমন কোনও লক প্রকাশ করে যা সে আসলে ধারণ করে না তবে তা বোঝা যায় না।
পেসারিয়ার

111
তাদের বিভিন্ন উদ্দেশ্য রয়েছে। Mutex একটি উত্স একচেটিয়া অ্যাক্সেস জন্য। একটি বাইনারি সেমফোর সিঙ্ক্রোনাইজেশনের জন্য ব্যবহার করা উচিত (যেমন "আরে কেউ! এটি ঘটেছে!")। বাইনারি "দাতা" কেবল যে "গ্রহণকারী" কে জানায় যে তারা যা অপেক্ষা করছিল তা ঘটেছিল।
বেনোইট

5
@ পেসারিয়ার আপনি উদ্দেশ্যটি বিভ্রান্ত করছেন। একটি মিউটেক্স একটি সমালোচনামূলক অঞ্চলকে সুরক্ষিত করার উদ্দেশ্যে তৈরি। আপনি সঠিক, বাইনারি সেম্যাফোরটি ব্যবহার করার কোনও অর্থ নেই। আমি প্রত্যেকের উদ্দেশ্য ব্যাখ্যা করতে উত্তর আপডেট করব।
বেনোইট

4
@ বেনোইট তাই আমরা কি বলতে পারি যে মুটেক্স অ্যাটমিকিটি এবং বাইনারি সেম্যাফোরকে অর্ডারিং দৃষ্টিভঙ্গির জন্য ব্যবহার করা হয় যেহেতু টাস্ক বি কোনও তাত্ক্ষণিকভাবে কোনও ডেটা স্ট্রাকচারের ক্রিয়াকলাপের ক্রমটি নিশ্চিত করার জন্য লকটি প্রকাশের ইঙ্গিত দেওয়ার জন্য টাস্ক এ-এর অপেক্ষায় থাকবে?
অভি

1
@ বিবি এটি মুটেক্সের জন্য এটি দেখার জন্য ভাল উপায়। তবে ওএসের উপর নির্ভর করে আপনার বাইনারি সেম্যাফোরে একাধিক প্রাপক অপেক্ষা করতে পারেন। সেক্ষেত্রে কেবল ক্লায়েন্টের একজনই বাইনারি সেম পাবেন। অন্যান্য (গুলি) পরবর্তীগুলির জন্য অপেক্ষা করবে। প্রাপ্তির ক্রমটি কি পরিচিত বা গ্যারান্টিযুক্ত? ওএসের উপর নির্ভর করে।
বোনয়েট

446
  • একটি মুটেক্স কেবলমাত্র সেই থ্রেড দ্বারা প্রকাশ করা যেতে পারে যা এটি অর্জন করেছিল
  • একটি বাইনারি সেমফোর্ সংকেত হতে পারে কোনো থ্রেড দ্বারা (অথবা প্রক্রিয়ার মধ্যে)।

সুতরাং উত্পাদক-ভোক্তার মতো কিছু সিঙ্ক্রোনাইজেশন সমস্যার জন্য সেমোফোরগুলি আরও উপযুক্ত।

উইন্ডোজে, বাইনারি সেমোফোরগুলি মিউটেক্সগুলির চেয়ে ইভেন্ট অবজেক্টের মতো।


34
Mutex can be released only by thread that had acquired it- আমি কেবল একটি সাধারণ pthread_mutex ভিত্তিক প্রোগ্রাম দিয়ে চেষ্টা করেছি, একটি থ্রেড মূল থ্রেডে থাকা মূটেক্সকে আনলক করতে পারে
ডেইজি

15
@ warl0ck pthread_mutex_lock linux.die.net/man/3/pthread_mutex_lock এর ম্যান পেজ অনুসারে : "যদি মিউটেক্স টাইপটি PTHREAD_MUTEX_ERRORCHECK হয়, তবে ত্রুটি পরীক্ষার ব্যবস্থা করা হবে .... যদি কোনও থ্রেড এটিতে থাকা কোনও মিটেক্সকে আনলক করার চেষ্টা করে তবে .... লক করা নেই বা এমন কোনও মিটেক্স যা আনলক করা আছে, ত্রুটি ফিরে আসবে। "
amit

47
@ warl0ck দয়া করে দেখতে stackoverflow.com/a/5492499/385064 ফাস্ট mutex, রিকার্সিভ mutex, এবং ত্রুটি পরীক্ষা mutex: 'Pthreads mutexes 3 বিভিন্ন ধরণের আছে। আপনি একটি দ্রুত মিটেক্স ব্যবহার করেছেন যা কার্য সম্পাদনের কারণে এই ত্রুটিটি পরীক্ষা করে না। আপনি যদি লিনাক্সে মুটেক্স পরীক্ষা করতে ত্রুটি ব্যবহার করেন তবে আপনি প্রত্যাশিত ফলাফল পেয়ে যাবেন ''
ফ্রস্টনোভাজেজ

1
আমাদের কোডে আমরা মুটিেক্সকেও সিঙ্ক্রোনাইজেশনের উদ্দেশ্যে ব্যবহার করেছি Th যে থ্রেডটি মুটেক্সকে আবার তালা দেওয়ার চেষ্টা করেছিল henএটি এটি অবরুদ্ধ অবস্থায় চলে যায় hat যা আমরা দেখেছি তা হল আমরা এটি অন্য থ্রেড থেকে আনলক করতে সক্ষম hus এটি অর্জন দু'জনের মধ্যে সিঙ্ক্রোনাইজেশন.আমরা কেবলমাত্র পিক্সিক স্ট্যান্ডার্ড ব্যবহার করছি o সুতরাং মুটেক্স এবং বাইনারি সেমফোরের মধ্যে নির্ধারিত প্রধান পার্থক্যটি অস্পষ্ট বলে মনে হয়।
আটুরা

1
@achoora আমি সম্মত হই যে সিঙ্ক্রোনাইজেশনের জন্য সেমফোর বিশেষায়িত করা ভুল। আসলে সমস্ত মুটেক্স, বাইনারি-সেমফোর, বাধা, পাইপলাইনগুলি সিঙ্ক্রোনাইজেশনের জন্য আলাদা নিদর্শন। নকশার দৃষ্টিকোণে, মিটেক্স আরও বেশি রাষ্ট্র-প্যাটার্নের মতো যেখানে রাষ্ট্র দ্বারা নির্বাচিত অ্যালগরিদম রাষ্ট্র পরিবর্তন করতে পারে। বাইনারি-সেমফোর আরও কৌশল কৌশল হিসাবে যেমন বাহ্যিক অ্যালগরিদম রাষ্ট্র পরিবর্তন করতে পারে এবং শেষ পর্যন্ত অ্যালগরিদম / কৌশলটি চালনার জন্য নির্বাচিত হয়।
শুভা

442

টয়লেট উদাহরণটি একটি উপভোগ্য উপমা:

mutex:

একটি টয়লেট জন্য চাবি। একটি ব্যক্তির চাবি থাকতে পারে - টয়লেটটি দখল করুন - সময়ে। শেষ হয়ে গেলে, ব্যক্তিটি কাতারে থাকা পরবর্তী ব্যক্তিকে চাবি (মুক্ত করে) দেয়।

আনুষ্ঠানিকভাবে: "মুটেক্সগুলি সাধারণত পুনরায় প্রবেশকারী কোডের একটি অংশে অ্যাক্সেস সিরিয়াল করতে ব্যবহৃত হয় যা একাধিক থ্রেড দ্বারা একযোগে কার্যকর করা যায় না A এই বিভাগটি থেকে প্রথম থ্রেডটি বের না হওয়া অবধি অপেক্ষা করতে হবে। রেফ: সিম্বিয়ান বিকাশকারী গ্রন্থাগার

(একটি মিটেক্সটি হ'ল মান 1 সহ একটি সেমফোর))

সেমফোর্:

বিনামূল্যে অভিন্ন শৌচাগার কীগুলির সংখ্যা। উদাহরণস্বরূপ, বলুন যে আমাদের কাছে অভিন্ন লক এবং কী সহ চারটি টয়লেট রয়েছে। সেমফোর গণনা - কীগুলির গণনা - শুরুতে 4 এ সেট করা হয় (চারটি শৌচাগার নিখরচায়), তারপরে লোকেরা আসার সাথে সাথে গণনা মান হ্রাস পাবে all কোনও নিখরচায় কী নেই, সেমফোর গণনা 0 এখন e এক ব্যক্তি টয়লেট ছেড়ে যায়, সেমফোর 1 টি (একটি ফ্রি কী) এ উন্নীত হয় এবং পরের ব্যক্তিকে সারিতে দেওয়া হয়।

আনুষ্ঠানিকভাবে: "একটি সেম্যাফোর একটি শেয়ার্ড রিসোর্সের যুগপত ব্যবহারকারীর সংখ্যা সর্বাধিক সংখ্যক পর্যন্ত সীমাবদ্ধ করে Th " রেফ: সিম্বিয়ান বিকাশকারী গ্রন্থাগার


233
... তবে এটি মেটেক্স বনাম গণনা সেমফোর সম্পর্কিত। বাইনারি সম্পর্কে প্রশ্ন করা হয়েছিল।
রোমান নিকচেনকো

24
যদিও ডেভিড যা বলেছে তা সঠিক, তবে এটি জিজ্ঞাসিত প্রশ্নের উত্তর নয়। "বাইনারি-সেম্যাফোর" বনাম "মুটেক্স" কে আলাদা করার জন্য প্লেডটি তৈরি করা প্রশ্নের উত্তর ম্লাদেন জাঙ্কোভিচের উত্তর।
অজিত গঙ্গা

13
দুর্ভাগ্যক্রমে, এই ভুল উত্তরের @Benoit
নিওনগ্লো

6
এই উত্তরটি বিভ্রান্তিমূলক S কেবল বাইনারি সেমাফোরের সাথে তুলনা করা উচিত।
হেমন্ত

3
এটি একটি ভাগ করা সংস্থান রক্ষার জন্য একটি গণনা সেমফোর ব্যবহার করে একটি সমস্যাও দেখায়: কীগুলি যদি সত্যই অভিন্ন হয় এবং কোনও শৌচাগার কী ব্যবহার করে তালাবদ্ধ থাকে এবং ঘনক্ষেত্রের ব্যবহার বিতরণ করার মতো অন্য কোনও ব্যবস্থা নেই, তবে: (1) প্রথম ব্যবহারকারী আনলক করে, প্রবেশ করে এবং প্রথম কিউবিকেল ব্যবহার শুরু করে। (২) পরবর্তী ব্যবহারকারী আনলক করে, প্রবেশ করে এবং প্রথম ঘনক্ষেত্র ব্যবহার শুরু করে ...
টেকনোফিল

151

বিষয়টিতে দুর্দান্ত নিবন্ধগুলি:

অংশ 2 থেকে:

মিউটেক্স বাইনারি সেমফোরের নীতির সাথে একই সাথে একটি উল্লেখযোগ্য পার্থক্য: মালিকানার নীতি। মালিকানা হ'ল এই সহজ ধারণাটি যখন কোনও টাস্ক একটি মুটেক্সকে লক করে (অর্জন করে) কেবল তখনই এটি আনলক করতে পারে (মুক্তি দিতে পারে)। কোনও কাজ যদি কোনও মিউটেক্সকে আনলক করার চেষ্টা করে তবে এটি লক হয়নি (সুতরাং এটি নিজস্ব নয়) তবে একটি ত্রুটির শর্তটি সম্মুখীন হয় এবং সর্বাগ্রে গুরুত্বপূর্ণ, মিউটেক্সটি আনলক করা হয় না। যদি মিউচুয়াল এক্সক্লুসিভ অবজেক্টটির মালিকানা না থাকে তবে যাকে বলা হয় তা অপ্রাসঙ্গিক, এটি কোনও মিটেক্স নয়।


লিঙ্কটির জন্য ধন্যবাদ, সেখানে ব্যাখ্যাগুলি দুর্দান্ত। লিঙ্কটি পরিবর্তিত হয়েছে: feabhas.com/blog/2009/09/… (অন্যান্য দুটি নিবন্ধ নেভিগেট করতে <পূর্ববর্তী এবং পরবর্তী> ব্যবহার করুন
হারুন এইচ

অ্যারন আমি লিঙ্কগুলি স্থির করে
রেখেছি

দ্রষ্টব্য - মালিকানার অভাব অপারেটিং সিস্টেমটিকে অগ্রাধিকার বিপরীতে কাজ করতে বাধা দেয়। এই কারণে, আমি সাধারণত উত্পাদক / ভোক্তা আর্কিটেকচারের জন্য سيمফোরগুলির বিপরীতে শর্ত ভেরিয়েবলগুলি ব্যবহার করি।
কেগ্রিফস

1
+1 শত্রু দুর্দান্ত নিবন্ধ লিঙ্ক। "হোয়াট-ইট-ইজ" এবং "হোয়াট-ইট-ডিটিস" কম্পিউটিং.এলএনএল.এল.ভি. / টিউটোরিয়ালস / স্প্যাড্রেডস সহ সেম্যাফোর এবং মিটেক্সকে ব্যাখ্যা করার সেরা নিবন্ধটি আমার এই নিবন্ধটি দৃশ্যের রেফারেন্সের পিছনে হিসাবে ব্যবহার করেছে, যা প্রযুক্তিগতভাবে সমস্ত কিছু ব্যাখ্যা করে তাদের শীর্ষে সেমফোর / বাধা / পাঠক-লেখকের মতো মিউেক্সেক্স / শর্তসাপেক্ষে তৈরি অন্যান্য কন্সট্রাক্টস, তবে নির্মাণের ক্ষেত্রে যে সমস্যাগুলি রয়েছে সেগুলি সম্পর্কে স্পষ্ট এবং সংক্ষিপ্ত কোথাও নেই। সংক্ষেপে এটি রেফারেন্স। :)
অজিত গঙ্গা

অন্যান্য উত্তরগুলির চেয়ে আরও সহজে বোঝা যায়।
বাইনারিট্রি

101

যেহেতু উপরের উত্তরগুলির কোনওটিই বিভ্রান্তি পরিষ্কার করে না, তাই এখানে আমার বিভ্রান্তি পরিষ্কার করা হয়েছে।

কড়া কথায় বলতে গেলে, একটি মিউটেক্স একটি লকিং প্রক্রিয়া যা কোনও সংস্থার অ্যাক্সেসকে সিঙ্ক্রোনাইজ করতে ব্যবহৃত হয়। কেবলমাত্র একটি কাজ (ওএস বিমূর্তির উপর ভিত্তি করে একটি থ্রেড বা প্রক্রিয়া হতে পারে) মিউটেক্সটি অর্জন করতে পারে। এর অর্থ মিটেক্সের সাথে সম্পর্কিত মালিকানা থাকবে এবং কেবল মালিক লকটি (মুটেক্স) প্রকাশ করতে পারবেন।

Semaphore সংকেত প্রক্রিয়া করছে ("আমি সম্পন্ন হয়েছি, আপনি চালিয়ে নিতে পারেন" ধরনের সংকেত)। উদাহরণস্বরূপ, আপনি যদি নিজের মোবাইলে গান শুনছেন (এটি এক কাজ হিসাবে ধরে নিন) এবং একই সময়ে আপনার বন্ধু আপনাকে ডেকেছে, একটি বাধাপ্রাপ্ত হবে যা একটি বিঘ্নিত পরিষেবা রুটিন (আইএসআর) কল প্রসেসিং টাস্ককে জাগ্রত করতে সংকেত দেবে ।

সূত্র: http://www.geeksforgeeks.org/mutex-vs-semaphore/


42

তাদের সিঙ্ক্রোনাইজেশন শব্দার্থবিদ্যা খুব আলাদা:

  • মিউটেক্সগুলি প্রদত্ত সংস্থানটিতে অ্যাক্সেসের সিরিয়ালাইজেশনকে অনুমতি দেয় যেমন একাধিক থ্রেড লকটির জন্য একবার অপেক্ষা করে এবং আগেই বলেছিল, থ্রেডটি লকটি সম্পন্ন না হওয়া পর্যন্ত তার মালিকানাধীন : কেবল এই নির্দিষ্ট থ্রেড এটি আনলক করতে পারে।
  • বাইনারি সেম্যাফোর হল 0 এবং 1 এর মান সহ একটি কাউন্টার: কোনও টাস্ক সেম_পোস্ট না করা পর্যন্ত একটি কাজ এতে অবরুদ্ধ থাকে। সেম্যাফোর বিজ্ঞাপন দেয় যে একটি সংস্থান উপলব্ধ এবং এটি উপলব্ধ হওয়া পর্যন্ত এটি অপেক্ষা করার প্রক্রিয়া সরবরাহ করে।

যেহেতু একটি টুঙ্কনটি টাস্ক থেকে কার্যগুলিতে রূপান্তরিত হিসাবে একটি মুটেক্স এবং একটি সেমফোরকে ট্র্যাফিক রেডলাইট হিসাবে দেখতে পায় (এটি এমন কাউকে ইঙ্গিত দেয় যে এটি এগিয়ে যেতে পারে)।


23

তাত্ত্বিক স্তরে, তারা শব্দার্থগতভাবে আলাদা নয়। আপনি semaphores বা বিপরীতে ব্যবহার করে একটি মিটেক্স প্রয়োগ করতে পারেন ( উদাহরণের জন্য এখানে দেখুন )। অনুশীলনে, বাস্তবায়ন আলাদা এবং তারা কিছুটা আলাদা পরিষেবা দেয়।

ব্যবহারিক পার্থক্য (তাদের চারপাশের সিস্টেম পরিষেবাদির নিরিখে) হ'ল মিউটেক্সের বাস্তবায়নটি আরও বেশি লাইটওয়েটের সিঙ্ক্রোনাইজেশন প্রক্রিয়া হওয়ার লক্ষ্য। ওরাকল-কথা, mutexes হিসাবে পরিচিত হয় Latches এবং semaphores হিসাবে পরিচিত হয় অপেক্ষা করছে

নিম্নতম স্তরে, তারা কিছু ধরণের পারমাণবিক পরীক্ষা এবং সেট মেকানিজম ব্যবহার করে। এটি মেমরির অবস্থানের বর্তমান মানটি পড়ছে, কিছু শর্তসাপেক্ষ শর্ত গণনা করে এবং কোনও একক নির্দেশনায় সেই স্থানে একটি মান লিখে দেয় যা বাধা দেওয়া যায় না । এর অর্থ হল আপনার আগে অন্য কারও কাছে এটি আছে কিনা তা দেখতে আপনি একটি মুটেক্স এবং পরীক্ষা অর্জন করতে পারেন।

একটি সাধারণ মুউটেক্স প্রয়োগের একটি প্রক্রিয়া বা থ্রেড থাকে যা টেস্ট অ্যান্ড সেট নির্দেশনা কার্যকর করে এবং মূল্যায়ন করে যে অন্য কোনও কিছু মিটেক্স সেট করেছে কিনা। এখানে একটি মূল বিষয় হ'ল শিডিয়ুলারের সাথে কোনও কথোপকথন নেই , তাই লকটি সেট করেছেন এমন আমাদের ধারণা নেই (এবং যত্ন নেই)। তারপরে আমরা হয় আমাদের সময় স্লাইস ছেড়ে দিয়ে আবার চেষ্টা করি যখন টাস্কটি পুনরায় নির্ধারিত হয় বা কোনও স্পিন-লক কার্যকর করা হয় । একটি স্পিন লক একটি অ্যালগরিদম এর মতো:

Count down from 5000:
     i. Execute the test-and-set instruction
    ii. If the mutex is clear, we have acquired it in the previous instruction 
        so we can exit the loop
   iii. When we get to zero, give up our time slice.

যখন আমরা আমাদের সুরক্ষিত কোডটি কার্যকর করি (একটি সমালোচনা বিভাগ হিসাবে পরিচিত ) আমরা কেবলমাত্র মিটেক্স মানটি শূন্য বা যে কোনও অর্থ 'ক্লিয়ার' তে সেট করি। যদি একাধিক টাস্ক মিউটেক্স অর্জনের চেষ্টা করে তবে তারা পরবর্তী কাজটি মুটেেক্স প্রকাশের পরে নির্ধারিত হওয়ার পরে সংস্থানটিতে অ্যাক্সেস পাবে। সাধারণত আপনি একটি সিঙ্ক্রোনাইজড রিসোর্স নিয়ন্ত্রণ করতে মুটিেক্স ব্যবহার করবেন যেখানে একচেটিয়া অ্যাক্সেস কেবলমাত্র খুব অল্প সময়ের জন্য প্রয়োজন, সাধারণত একটি শেয়ার্ড ডেটা কাঠামোতে আপডেট করার জন্য।

একটি সেম্যাফোর একটি সিঙ্ক্রোনাইজড ডেটা স্ট্রাকচার (সাধারণত মুটেক্স ব্যবহার করে) যা একটি গণনা এবং কিছু সিস্টেম কল র্যাপার যা মুটেক্স লাইব্রেরিগুলির তুলনায় কিছুটা গভীরতায় শিডিয়ুলারের সাথে যোগাযোগ করে। Semaphores বর্ধিত এবং হ্রাস করা হয় এবং অন্য কিছু প্রস্তুত না হওয়া পর্যন্ত কাজগুলিতে ব্লক করতে ব্যবহৃত হয় । এর একটি সাধারণ উদাহরণের জন্য প্রযোজক / গ্রাহক সমস্যা দেখুন । সেমোফোরগুলি কিছু মূল্যের সাথে সূচনা করা হয় - বাইনারি সেম্যাফোরটি কেবল একটি বিশেষ ক্ষেত্রে যেখানে সেমফোরটি সূচনা করা হয় 1 থেকে একটি সেমফোরে পোস্ট করা একটি ওয়েটিং প্রক্রিয়া জাগ্রত করার প্রভাব রাখে।

একটি মৌলিক সেমফোর অ্যালগরিদম এর মতো দেখাচ্ছে:

(somewhere in the program startup)
Initialise the semaphore to its start-up value.

Acquiring a semaphore
   i. (synchronised) Attempt to decrement the semaphore value
  ii. If the value would be less than zero, put the task on the tail of the list of tasks waiting on the semaphore and give up the time slice.

Posting a semaphore
   i. (synchronised) Increment the semaphore value
  ii. If the value is greater or equal to the amount requested in the post at the front of the queue, take that task off the queue and make it runnable.  
 iii. Repeat (ii) for all tasks until the posted value is exhausted or there are no more tasks waiting.

বাইনারি semaphore ক্ষেত্রে উভয়ের মধ্যে প্রধান ব্যবহারিক পার্থক্য হ'ল প্রকৃত ডেটা কাঠামোকে ঘিরে থাকা সিস্টেম পরিষেবাদির প্রকৃতি।

সম্পাদনা: ইয়ান যেমন সঠিকভাবে নির্দেশ করেছে, স্পিনলকগুলি একটি একক প্রসেসর মেশিনকে ধীর করবে। আপনি কেবল একটি মাল্টি-প্রসেসর বাক্সে একটি স্পিনলক ব্যবহার করবেন কারণ একটি একক প্রসেসরে মূটেক্স ধারণ প্রক্রিয়া কখনই এটি পুনরায় সেট করতে পারে না যখন অন্য কোনও কাজ চলছে। স্পিনলকগুলি কেবলমাত্র বহু-প্রসেসরের আর্কিটেকচারে কার্যকর।


1
আমি মনে করি না স্পিনলকসের সাথে মিটেক্স প্রয়োগ করা সাধারণ অভ্যাস is ইউনি-প্রোক মেশিনে এটি পারফরম্যান্সের জন্য একেবারে ভয়ানক।
ইভান তেরান

সাধারণত আপনি কেবল মাল্টি-প্রসেসর সিস্টেমে স্পিনলক ব্যবহার করবেন।
কনসার্নড

এমনকি এসএমপি-তে, কয়েকবার স্পিনিংয়ের পরে আপনি ওএস-সহায়ক ঘুম / জাগ্রত হয়ে ফিরে যান। (যেমন লিনাক্স futexসিস্টেম কল সহায়তা করার বিদ্যমান কম লেটেন্সি ইউজার-স্পেস mutex / সেমফোর্ বাস্তবায়নের। en.wikipedia.org/wiki/Futex ) নো-বিবাদের ফাস্ট পথে, অথবা যদি রিসোর্স প্রাপ্তিসাধ্য শীঘ্রই হয়ে, তোমাদের মধ্যে ওভারহেড কখনও একটি সিস্টেম কল। তবে আপনি ব্যস্ত-অপেক্ষার (কাটনা) কয়েক মাইক্রো সেকেন্ডের বেশি ব্যয় করবেন না। স্পিন-লুপ ব্যাক অফের প্যারামিটারগুলি টিউন করা এবং অপেক্ষা করা হার্ডওয়ার এবং কাজের চাপ-নির্ভর, অবশ্যই, তবে স্ট্যান্ডার্ড লাইব্রেরিতে সাধারণত যুক্তিসঙ্গত পছন্দ থাকে।
পিটার

19

যদিও মিটেক্স এবং সেমোফোরগুলি সিঙ্ক্রোনাইজেশন আদিম হিসাবে ব্যবহৃত হয়, তবে তাদের মধ্যে একটি বড় পার্থক্য রয়েছে। মুটেেক্সের ক্ষেত্রে কেবল যে থ্রেডটি মুটেক্সকে লক করেছে বা অর্জন করেছে তা এটিকে আনলক করতে পারে। একটি সেমফোরের ক্ষেত্রে, সেমফোরের অপেক্ষায় থাকা থ্রেডটি আলাদা থ্রেড দ্বারা সংকেত দেওয়া যেতে পারে। কিছু অপারেটিং সিস্টেম প্রক্রিয়াটির মধ্যে মিটেক্স এবং সেমফোরগুলি ব্যবহার করে। সাধারণত ব্যবহার ভাগ করা মেমরিতে তৈরি করা হয়।


"একটি আলাদা থ্রেড দ্বারা সংকেত দেওয়া যেতে পারে" একটি উদাহরণ দেওয়ার অর্থ কী।
মায়ানজু

15

নিঃশব্দ: ধরুন আমাদের কাছে সমালোচনামূলক বিভাগের থ্রেড টি 1 এটি অ্যাক্সেস করতে চায় তবে এটি নীচের পদক্ষেপগুলি অনুসরণ করে। T1 এর:

  1. লক
  2. সমালোচনা বিভাগ ব্যবহার করুন
  3. আনলক

বাইনারি সেমফোর: এটি সংকেত অপেক্ষা এবং সংকেতের ভিত্তিতে কাজ করে। অপেক্ষা (গুলি) হ্রাস "s" মান একটি দ্বারা "s" মান সাধারণত "1" মান দিয়ে আরম্ভ করা হয়, সংকেত (গুলি) দ্বারা "s" মান বৃদ্ধি পায়। যদি "s" মান 1 এর অর্থ কেউই সমালোচনামূলক বিভাগ ব্যবহার করে না, যখন মান 0 হয় সমালোচনা বিভাগটি ব্যবহৃত হয়। ধরুন থ্রেড টি 2 সমালোচনা বিভাগটি ব্যবহার করছে তারপরে এটি নীচের পদক্ষেপগুলি অনুসরণ করে। টি 2:

  1. অপেক্ষা (গুলি) // প্রাথমিকভাবে মানগুলি অপেক্ষা করার পরে এটির মান এক অর্থাৎ 0 দ্বারা কমে যায়
  2. সমালোচনা বিভাগ ব্যবহার করুন
  3. সিগন্যাল (গুলি) // এখন s এর মান বৃদ্ধি পেয়ে এটি 1 হয়ে যায়

মুটেক্স এবং বাইনারি সেমফোরের মধ্যে মূল পার্থক্যটি মুটেক্সটে হয় যদি থ্রেডটি সমালোচনামূলক বিভাগটি লক করে থাকে তবে এটি সমালোচনামূলক বিভাগটিকে আনলক করতে হবে অন্য কোনও থ্রেড এটি আনলক করতে পারে না, তবে বাইনারি সেমফোরের ক্ষেত্রে যদি একটি থ্রেড সমালোচনামূলক বিভাগটি ওয়েট (গুলি) ফাংশন ব্যবহার করে লক করে তবে মানটি s এর "0" হয়ে যায় এবং "s" এর মান 1 না হওয়া পর্যন্ত কেউ এটিকে অ্যাক্সেস করতে পারে না তবে মনে করুন যে অন্য কিছু থ্রেড কল সিগন্যাল (গুলি) এর পরে "s" এর মান 1 হয়ে যায় এবং এটি অন্যান্য ফাংশনটিকে সমালোচনা বিভাগটি ব্যবহার করার অনুমতি দেয়। সুতরাং বাইনারি semaphore থ্রেডের মালিকানা নেই।


12

উইন্ডোজে, মিউটেক্স এবং বাইনারি সেমোফোরে দুটি পার্থক্য রয়েছে:

  1. একটি মুটেক্স কেবল সেই থ্রেড দ্বারা প্রকাশিত হতে পারে যার মালিকানা রয়েছে, অর্থাৎ থ্রেড যা আগে ওয়েট ফাংশন নামে পরিচিত, (বা এটি তৈরির সময় মালিকানা নিয়েছিল)। যে কোনও থ্রেড দ্বারা একটি সেমফোর প্রকাশ করা যেতে পারে।

  2. কোনও থ্রেড কোনও অবরুদ্ধতা ছাড়াই একটি মিটেক্সে বারবার অপেক্ষা ফাংশন কল করতে পারে। যাইহোক, আপনি যদি বাইনারি সেম্যাফোরে দু'বার ওয়েম ফাংশনটি সেম্যাফোরটিকে মাঝখানে না ছাড়িয়ে কল করেন তবে থ্রেডটি ব্লক হয়ে যাবে।


4
ভাল উত্তর. # 2 এ আপনি একটি পুনরাবৃত্তিমূলক মুকেক্স বর্ণনা করছেন - সমস্ত মুটেক্সগুলি অগত্যা পুনরাবৃত্ত হয় না। উদাহরণস্বরূপ, cs.wustl.edu/~schmidt/ACE.FAQ.html#Q14
ড্যান

10

আপনি একইভাবে অন্য থ্রেড দ্বারা অ্যাক্সেস পেয়ে একটি থ্রেডে কোনও ডেটা লক করার জন্য স্পষ্টতই মুটেক্স ব্যবহার করেন। ধরে নিন যে আপনি সবেমাত্র ডেকেছেন lock()এবং ডেটা অ্যাক্সেসের প্রক্রিয়ায়। এর অর্থ হ'ল আপনি অন্য কোনও থ্রেড (বা একই থ্রেড-কোডের অন্য কোনও উদাহরণ) একই মুটেক্স দ্বারা লক করা একই ডেটা অ্যাক্সেস করার আশা করেন না। এটি হ'ল, যদি এটি একই থ্রেড-কোডটি একটি ভিন্ন থ্রেড ইভেন্টে সম্পাদিত হয়, লকটিকে আঘাত করে, তবেlock()সেখানে নিয়ন্ত্রণ প্রবাহকে অবরুদ্ধ করা উচিত। এটি কোনও থ্রেডে প্রযোজ্য যা পৃথক থ্রেড-কোড ব্যবহার করে যা একই ডেটা অ্যাক্সেস করছে এবং যা একই মিটেক্স দ্বারা লক করা রয়েছে। এই ক্ষেত্রে, আপনি এখনও ডেটা অ্যাক্সেসের প্রক্রিয়ায় রয়েছেন এবং বলুন যে, মিটেক্স আনলকটিতে পৌঁছাতে আরও 15 সেকেন্ড নেবে (যাতে অন্য থ্রেড যা মুটেক্স লকটিতে ব্লক হয়ে যাচ্ছে তা অবরোধ মুক্ত করে দেবে এবং নিয়ন্ত্রণের অনুমতি দেবে) ডেটা অ্যাক্সেস করুন)। আপনি কি কোনও মূল্যে অন্য থ্রেডকে কেবল একই মুটেক্সটিকে আনলক করার অনুমতি দিচ্ছেন এবং ঘুরেফিরে, যে থ্রেডটি ইতিমধ্যে অপেক্ষায় থাকা (ব্লক করা) মুটেক্স লকটিতে ডেটা অবরোধ মুক্ত রাখতে এবং অ্যাক্সেস করার অনুমতি দেবে? আশা করি আমি এখানে যা বলছি তা পেয়েছ? হিসাবে হিসাবে, সর্বজনীন সংজ্ঞা উপর একমত !,

  • "মিটেক্স" দিয়ে এটি ঘটতে পারে না। অন্য কোনও থ্রেড আপনার থ্রেডের লকটি আনলক করতে পারে না
  • "বাইনারি-সেম্যাফোর" সহ এটি ঘটতে পারে। অন্য কোনও থ্রেড আপনার থ্রেডের লকটি আনলক করতে পারে

সুতরাং, আপনি যদি মুটেক্সের পরিবর্তে বাইনারি-সেমোফোর ব্যবহার সম্পর্কে খুব বিশেষভাবে অবগত হন তবে লক এবং আনলকগুলি আপনার "স্কোপিং" করতে খুব সতর্ক হওয়া উচিত। আমি বোঝাতে চাইছি যে প্রতিটি নিয়ন্ত্রণ-প্রবাহ যা প্রতিটি লককে আঘাত করে তা একটি আনলক কলকে আঘাত করা উচিত, সেখানে কোনও "প্রথম আনলক" থাকা উচিত নয়, বরং এটি সর্বদা "প্রথম লক" হওয়া উচিত।


10

Mutex "লকিং মেকানিজম" এর জন্য ব্যবহৃত হয়। একবারে একটি প্রক্রিয়া একটি ভাগ করা সংস্থান ব্যবহার করতে পারে

যেহেতু

"আমি সম্পন্ন হয়েছি, এখন চালিয়ে যেতে পারে" এর মতো "সিগন্যালিং মেকানিজম" এর জন্য সেমোফোরগুলি ব্যবহার করা হয়


9

শ্রুতি:

একাধিক নিবন্ধ বলে যে "বাইনারি সেম্যাফোর এবং মিটেক্স একই হয়" বা "সেমোফোর 1 সহ মানটি মুটেক্স" তবে মূল পার্থক্যটি মুটেক্স কেবলমাত্র থ্রেড দ্বারা প্রকাশ করা যেতে পারে যা এটি অর্জন করেছিল, যখন আপনি অন্য কোনও থ্রেড থেকে সেমফোরকে সংকেত দিতে পারবেন

গুরুত্বপূর্ণ দিক:

• একটি থ্রেড একাধিক লক (মুটেক্স) অর্জন করতে পারে।

• কোনও মিউটেক্স কেবল একবারের বেশি লক করা যায় যদি এটির পুনরাবৃত্তিকারী মুটেক্স, এখানে লক এবং আনলকটি মিটেক্সের জন্য একই থাকে

A যদি একটি থ্রেড যা ইতিমধ্যে একটি মিউটেক্সকে লক করে রেখেছিল, আবার মিউটেক্সটিকে লক করার চেষ্টা করে, এটি সেই মুটেক্সের অপেক্ষার তালিকায় প্রবেশ করবে, যার ফলস্বরূপ অচলাবস্থা রয়েছে।

• বাইনারি সেমফোর এবং মিটেক্স একই তবে একই নয়।

• মুটেক্স এর সাথে সম্পর্কিত সুরক্ষা প্রোটোকলের কারণে ব্যয়বহুল অপারেশন।

Ute মিটেক্সের মূল লক্ষ্য হ'ল পারমাণবিক অ্যাক্সেস অর্জন করা বা সংস্থানটিতে লক করা


8

একটি মিটেক্স একক ভাগ করা সংস্থানগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করে। এটি সেই সংস্থানটিতে () অ্যাক্সেস অর্জনের জন্য অপারেশন সরবরাহ করে এবং হয়ে গেলে () প্রকাশ করে।

একটি সেমফোর সম্পদগুলির একটি ভাগ করা পুলটিতে অ্যাক্সেস নিয়ন্ত্রণ করে। এটি পুলের কোনও সংস্থান উপলব্ধ না হওয়া অবধি অপেক্ষারত () অপারেশন সরবরাহ করে এবং যখন পুলটিতে ফেরত দেওয়া হয় তখন সিগন্যাল () সরবরাহ করে।

যখন একটি সেমফোর সুরক্ষিত সংস্থানগুলির সংখ্যা 1 এর চেয়ে বেশি হয়, তখন তাকে একটি গণনা সেমফোর বলা হয় । যখন এটি একটি সংস্থান নিয়ন্ত্রণ করে, তখন এটি বুলিয়ান সেমফোর নামে পরিচিত । একটি বুলিয়ান সেমফোর একটি মিউটেক্সের সমতুল্য।

সুতরাং একটি Semaphore Mutex তুলনায় একটি উচ্চ স্তরের বিমূর্ততা। একটি Mutex একটি Semaphore ব্যবহার করে প্রয়োগ করা যেতে পারে তবে অন্যভাবে নয়।


6

পরিবর্তিত প্রশ্নটি হ'ল - "লিনাক্স" এ "মিটেক্স" এবং "বাইনারি" সেমফোরের মধ্যে পার্থক্য কী?

উত্তর: নীচের পার্থক্যগুলি নিম্নরূপ - i) ব্যাপ্তি - মিটেক্সের ব্যাপ্তি একটি প্রক্রিয়া ঠিকানার জায়গার মধ্যে রয়েছে যা এটি তৈরি করেছে এবং থ্রেডগুলির সমন্বয়সাধনের জন্য ব্যবহৃত হয়। যেখানে প্রক্রিয়া স্থান জুড়ে semaphore ব্যবহার করা যেতে পারে এবং তাই এটি ইন্টারপ্রসেস সিঙ্ক্রোনাইজেশনের জন্য ব্যবহার করা যেতে পারে।

ii) মেটেক্সটি সেমোফোরের চেয়ে হালকা ও দ্রুত। ফুটেক্স আরও দ্রুত।

iii) Mutex একই থ্রেডের মাধ্যমে একাধিকবার সফলভাবে অধিগ্রহণ করা যেতে পারে এই শর্তে যে এটি একই সংখ্যক বার প্রকাশ করতে পারে। অন্যান্য থ্রেড অর্জন করার চেষ্টা করা অবরুদ্ধ হবে। যদিও সেমফোরের ক্ষেত্রে যদি একই প্রক্রিয়া আবার এটি অর্জন করার চেষ্টা করে তবে এটি কেবল একবারেই অধিগ্রহণ করা যেতে পারে।


আমি ভুল. ii) উত্স? iii) এটি নির্ভর করে।
কৌতূহলী

6

বাইনারি সেম্যাফোর এবং মুটেক্সের মধ্যে পার্থক্য: মালিকানা: সেমফোরগুলি কোনও বর্তমানের মালিকের কাছ থেকে এমনকি সিগন্যাল (পোস্ট) করা যেতে পারে। এর অর্থ হল আপনি অন্য কোনও থ্রেড থেকে কেবল পোস্ট করতে পারেন, যদিও আপনি মালিক নন।

সেমাফোর প্রক্রিয়াধীন একটি সর্বজনীন সম্পত্তি, এটি কেবল কোনও মালিকের থ্রেড দ্বারা পোস্ট করা যায় can এই পার্থক্যটি বোল্ড অক্ষরে চিহ্নিত করুন, এটির অর্থ অনেক বেশি।


5

মিটেক্স সমালোচনামূলক অঞ্চলকে অবরুদ্ধ করার কাজ করে, তবে সেমফোর গণনায় কাজ করে।


5

http://www.geeksforgeeks.org/archives/9102 বিস্তারিত আলোচনা করেছে।

Mutexএকটি সংস্থান অ্যাক্সেস সিঙ্ক্রোনাইজ করতে ব্যবহৃত লক মেকানিজম হয়। Semaphoreসংকেত প্রক্রিয়া হয়।

প্রোগ্রামার অবধি যদি সে / সে মুটিেক্সের জায়গায় বাইনারি সেমফোর ব্যবহার করতে চায়।


4

মিটেক্সগুলির একটি মালিক রয়েছে এই বিষয়টি বাদে দুটি বস্তু বিভিন্ন ব্যবহারের জন্য অনুকূলিত হতে পারে। মিউটেক্সগুলি কেবল অল্প সময়ের জন্যই ডিজাইন করা হয়েছে; এটি লঙ্ঘন খারাপ কর্মক্ষমতা এবং অন্যায্য সময়সূচী কারণ হতে পারে। উদাহরণস্বরূপ, একটি চলমান থ্রেডটিকে একটি মুটেক্স অর্জনের অনুমতি দেওয়া যেতে পারে, যদিও এটিতে অন্য থ্রেড ইতিমধ্যে অবরুদ্ধ রয়েছে। Semaphores আরও ন্যায্যতা প্রদান করতে পারে, বা ন্যায্যতা বেশ কয়েকটি শর্ত ভেরিয়েবল ব্যবহার করে বাধ্য করা যেতে পারে।


কোন নির্দিষ্ট ক্ষেত্রে ন্যূনতমতা semaphores জন্য গ্যারান্টিযুক্ত কিন্তু mutexes জন্য নয়?
কৌতূহলী

1
POSIX নির্দিষ্ট প্রয়োজনীয়তা যা থ্রেড দ্বারা উদ্বুদ্ধ করা উচিত হয়েছে sem_post()জন্য SCHED_FIFOএবং SCHED_RR(এই উভয় ডিফল্ট নেই): সর্বোচ্চ অগ্রাধিকার থ্রেড, এবং যদি একই অগ্রাধিকার, থ্রেড করেছে যে দীর্ঘতম অপেক্ষা করা হয়েছে সঙ্গে একাধিক হয়। ওপেনসোলারিস এমনকি সাধারণ সময় নির্ধারণের জন্য এই ফিফোর নিয়মটিকে কিছুটা ডিগ্রি অনুসরণ করে। গ্লিবসি এবং ফ্রিবিএসডি-র জন্য, একটি সাধারণ মুটেক্স আনলক করা (যেমন অগ্রাধিকার রক্ষা বা অগ্রাধিকারের উত্তরাধিকার নয়) এবং সেমফোর পোস্ট করা মূলত একই, অবজেক্টটিকে আনলক করা হিসাবে চিহ্নিত করা হয় এবং তারপরে, যদি অপেক্ষা থ্রেড থাকতে পারে, জেগে উঠার জন্য কার্নেলকে কল করে।
জিলিস

4

উইন্ডোতে পার্থক্যটি নীচের মতো। মিউটেক্স: প্রক্রিয়া যা সাফল্যের সাথে অপেক্ষা করে তার জন্য একটি সিগন্যাল কার্যকর করতে হয় এবং বিপরীতে। বাইনারি SEMAPHORES: বিভিন্ন প্রসেস নির্বাহ করতে পারেন অপেক্ষার বা সংকেত একটি সেমফোর্ উপর অপারেশন।


4

বাইনারি সেমফোরটি একটি মুটেক্স হিসাবে ব্যবহার করা যেতে পারে, তবে একটি মুটেক্স আরও সুনির্দিষ্ট ব্যবহারের ক্ষেত্রে হয়, কেবলমাত্র সেই প্রক্রিয়াটি যে মুটেক্সটিকে লক করে রেখেছিল তা আনলক করার কথা। এই মালিকানার সীমাবদ্ধতা এর বিরুদ্ধে সুরক্ষা সরবরাহ করা সম্ভব করে তোলে:

  • দুর্ঘটনাজনিত মুক্তি
  • পুনরাবৃত্তি ডিডলক
  • কার্য মৃত্যুর অচলাবস্থা

এই সীমাবদ্ধতাগুলি সর্বদা উপস্থিত হয় না কারণ তারা গতি হ্রাস করে। আপনার কোডের বিকাশের সময় আপনি এই চেকগুলি সাময়িকভাবে সক্ষম করতে পারবেন।

যেমন আপনি নিজের মিটেক্সে ত্রুটি চেক বৈশিষ্ট্য সক্ষম করতে পারেন। EDEADLKআপনি যদি একইটিকে দু'বার লক করার চেষ্টা করেন এবং EPERMআপনি যদি এমন কোনও মিটেক্সকে আনলক করেন তবে মুটেক্সগুলি ফিরে আসার সময় ত্রুটি ।

pthread_mutex_t mutex;
pthread_mutexattr_t attr;
pthread_mutexattr_init (&attr);
pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
pthread_mutex_init (&mutex, &attr);

একবার সূচনা করার পরে আমরা আমাদের কোডগুলিতে এই চেকগুলি রাখতে পারি:

if(pthread_mutex_unlock(&mutex)==EPERM)
 printf("Unlock failed:Mutex not owned by this thread\n");

4

উপরের পোস্টগুলিতে যাওয়ার পরে ধারণাটি আমার কাছে পরিষ্কার ছিল। তবে কিছু দীর্ঘ প্রশ্ন ছিল। তো, আমি এই ছোট্ট কোডটি লিখেছি।

যখন আমরা এটি না নিয়ে সেমফোর দেওয়ার চেষ্টা করি তখন তা হয়ে যায়। কিন্তু, আপনি যখন এটি না নিয়ে একটি মুটেক্স দেওয়ার চেষ্টা করেন, এটি ব্যর্থ হয়। আমি এটি একটি উইন্ডোজ প্ল্যাটফর্মে পরীক্ষা করেছি। MUTEX ব্যবহার করে একই কোড চালানোর জন্য USE_MUTEX সক্ষম করুন।

#include <stdio.h>
#include <windows.h>
#define xUSE_MUTEX 1
#define MAX_SEM_COUNT 1

DWORD WINAPI Thread_no_1( LPVOID lpParam );
DWORD WINAPI Thread_no_2( LPVOID lpParam );

HANDLE Handle_Of_Thread_1 = 0;
HANDLE Handle_Of_Thread_2 = 0;
int Data_Of_Thread_1 = 1;
int Data_Of_Thread_2 = 2;
HANDLE ghMutex = NULL;
HANDLE ghSemaphore = NULL;


int main(void)
{

#ifdef USE_MUTEX
    ghMutex = CreateMutex( NULL, FALSE, NULL);
    if (ghMutex  == NULL) 
    {
        printf("CreateMutex error: %d\n", GetLastError());
        return 1;
    }
#else
    // Create a semaphore with initial and max counts of MAX_SEM_COUNT
    ghSemaphore = CreateSemaphore(NULL,MAX_SEM_COUNT,MAX_SEM_COUNT,NULL);
    if (ghSemaphore == NULL) 
    {
        printf("CreateSemaphore error: %d\n", GetLastError());
        return 1;
    }
#endif
    // Create thread 1.
    Handle_Of_Thread_1 = CreateThread( NULL, 0,Thread_no_1, &Data_Of_Thread_1, 0, NULL);  
    if ( Handle_Of_Thread_1 == NULL)
    {
        printf("Create first thread problem \n");
        return 1;
    }

    /* sleep for 5 seconds **/
    Sleep(5 * 1000);

    /*Create thread 2 */
    Handle_Of_Thread_2 = CreateThread( NULL, 0,Thread_no_2, &Data_Of_Thread_2, 0, NULL);  
    if ( Handle_Of_Thread_2 == NULL)
    {
        printf("Create second thread problem \n");
        return 1;
    }

    // Sleep for 20 seconds
    Sleep(20 * 1000);

    printf("Out of the program \n");
    return 0;
}


int my_critical_section_code(HANDLE thread_handle)
{

#ifdef USE_MUTEX
    if(thread_handle == Handle_Of_Thread_1)
    {
        /* get the lock */
        WaitForSingleObject(ghMutex, INFINITE);
        printf("Thread 1 holding the mutex \n");
    }
#else
    /* get the semaphore */
    if(thread_handle == Handle_Of_Thread_1)
    {
        WaitForSingleObject(ghSemaphore, INFINITE);
        printf("Thread 1 holding semaphore \n");
    }
#endif

    if(thread_handle == Handle_Of_Thread_1)
    {
        /* sleep for 10 seconds */
        Sleep(10 * 1000);
#ifdef USE_MUTEX
        printf("Thread 1 about to release mutex \n");
#else
        printf("Thread 1 about to release semaphore \n");
#endif
    }
    else
    {
        /* sleep for 3 secconds */
        Sleep(3 * 1000);
    }

#ifdef USE_MUTEX
    /* release the lock*/
    if(!ReleaseMutex(ghMutex))
    {
        printf("Release Mutex error in thread %d: error # %d\n", (thread_handle == Handle_Of_Thread_1 ? 1:2),GetLastError());
    }
#else
    if (!ReleaseSemaphore(ghSemaphore,1,NULL) )      
    {
        printf("ReleaseSemaphore error in thread %d: error # %d\n",(thread_handle == Handle_Of_Thread_1 ? 1:2), GetLastError());
    }
#endif

    return 0;
}

DWORD WINAPI Thread_no_1( LPVOID lpParam ) 
{ 
    my_critical_section_code(Handle_Of_Thread_1);
    return 0;
}


DWORD WINAPI Thread_no_2( LPVOID lpParam ) 
{
    my_critical_section_code(Handle_Of_Thread_2);
    return 0;
}

যদিও সেমফোর আপনাকে "এটি একটি সংস্থান ব্যবহার করে সম্পন্ন করা হয়েছে" সংকেত দিতে দেয়, যদিও এটি কখনও সম্পদের মালিকানাধীন না, সেহেতু আমার মনে হয় যে সেমোফোরেসের মালিকানা এবং সংকেতের মধ্যে একটি খুব আলগা দম্পতি রয়েছে।


আপনি যদি অন্য উত্তরগুলি পড়েন তবে এটি স্পষ্ট যে "মালিকানা" ধারণাটি কেবল মেটেক্সেস দিয়ে বোঝায়, সেমফোরগুলি নয়। থিমের মতো জিনিসগুলির জন্য অন্যান্য থ্রেডগুলি জানাতে দেয় যে ডেটাগুলির একটি অংশের প্রক্রিয়াজাতকরণ প্রক্রিয়াজাত হয়েছে; ফলাফল পড়ার জন্য প্রস্তুত।
পিটার

2

সংবেদনশীল কোড এবং ডেটা সুরক্ষিত করতে মেটেক্স ব্যবহার করা হয়, সিমফোরটি সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয় the সংবেদনশীল কোডটি সুরক্ষিত করার জন্য আপনি ব্যবহারিক ব্যবহার করতে পারেন, তবে অপারেশন দ্বারা অন্য থ্রেড দ্বারা সুরক্ষা প্রকাশ করার ঝুঁকি থাকতে পারে ভি.এসো মূল দ্বি-সেম্যাফোর এবং মূটেক্সের মধ্যে পার্থক্য হল মালিকানা For উদাহরণস্বরূপ টয়লেট দ্বারা মুটেক্স এমনটি হয় যে কোনও ব্যক্তি টয়লেটে প্রবেশ করতে পারে এবং দরজাটি লক করতে পারে the টয়লেট এবং দরজাটি লক করে রাখলেও প্রশাসককে দরজা খোলার অনুরোধ করে অন্য কেউ প্রবেশ করতে পারে, এটি হাস্যকর।


2

mutex

মিউটেক্সগুলি সাধারণত পুনরায় প্রবেশকারী কোডের একটি অংশে অ্যাক্সেস সিরিয়াল করতে ব্যবহৃত হয় যা একাধিক থ্রেড দ্বারা একযোগে কার্যকর করা যায় না। কোনও মিউটেক্স অবজেক্টটি কেবল একটি থ্রেডকে নিয়ন্ত্রিত বিভাগে অনুমতি দেয়, অন্যান্য থ্রেডগুলিকে বাধ্য করে যা সেই বিভাগ থেকে অ্যাক্সেস অর্জনের চেষ্টা করে যা প্রথম থ্রেডটি সেই বিভাগ থেকে বের হওয়া অবধি অপেক্ষা করতে পারে a মিউটেক্সের ব্যবহারিক ব্যবহার একটি শেয়ার্ড রিসোর্সকে রক্ষা করা বিপজ্জনক হতে পারে অনিচ্ছাকৃত পার্শ্ব প্রতিক্রিয়া। যে কোনও দুটি আরটিওএস টাস্ক যা বিভিন্ন অগ্রাধিকারে পরিচালনা করে এবং একটি মিটেক্সের মাধ্যমে সমন্বয় করে, অগ্রাধিকার বিপরীতের সুযোগ তৈরি করে । Mutex ব্যবহারকারীর স্পেসে কাজ করে ।

সেমফোর্

Semaphore একটি সংকেত প্রক্রিয়া। সেমফোর একটি শেয়ারড রিসোর্সের একযোগে ব্যবহারকারীর সংখ্যা সর্বাধিক সংখ্যক পর্যন্ত সীমাবদ্ধ করে। থ্রেডগুলি রিসোর্সে অ্যাক্সেসের (সেমফোর হ্রাসকরণ) অনুরোধ করতে পারে এবং সংকেত দিতে পারে যে তারা সংস্থানটি ব্যবহার করে শেষ করেছেন (সেমফোর বাড়ানো)। এটি ভাগ করে নেওয়া সংস্থানগুলিতে অ্যাক্সেসের জন্য থ্রেডের সংখ্যাকে মঞ্জুরি দেয় a সেমফোরের সঠিক ব্যবহার হ'ল এক টাস্ক থেকে অন্য টাস্কে সিগন্যাল দেওয়ার জন্য se সেফেরগুলি কোনও কাজটিতে একটি বিঘ্নিত পরিষেবা রুটিন (আইএসআর) থেকে সিগন্যাল দেওয়ার জন্যও ব্যবহার করা যেতে পারে । একটি সেমফোর সিগন্যাল করা একটি অ-ব্লক করা আরটিওএস আচরণ এবং সুতরাং আইএসআর নিরাপদ। কারণ এই কৌশলটি ত্রুটি-প্রবণটিকে টাস্ক পর্যায়ে বাধা নিষ্ক্রিয় করার প্রয়োজনটি দূর করে his এটি কার্নেল স্পেসে কাজ করে ।


1

উত্তর লক্ষ্যযুক্ত ওএসের উপর নির্ভর করে। উদাহরণস্বরূপ, কমপক্ষে একটি আরটিওএস বাস্তবায়নের সাথে আমি পরিচিত যা একক ওএস মুটেক্সের বিরুদ্ধে একাধিক সিক্যুয়াল "পেতে" অপারেশনগুলিকে অনুমতি দেবে, যতক্ষণ না তারা সবাই একই থ্রেড প্রসঙ্গে থাকে। অন্য থ্রেডকে মিউটেক্স পাওয়ার অনুমতি দেওয়ার আগে একাধিক গেসগুলি সমান সংখ্যক পুট দ্বারা প্রতিস্থাপন করতে হবে। এটি বাইনারি আঞ্চলিক অঞ্চল থেকে পৃথক, যার জন্য থ্রেড প্রসঙ্গ নির্বিশেষে একবারে কেবলমাত্র একক প্রাপ্তির অনুমতি রয়েছে।

এই ধরণের মিটেক্সের পিছনে ধারণাটি হ'ল আপনি কেবল কোনও একক প্রসঙ্গে একবারে ডেটা পরিবর্তন করার অনুমতি দিয়ে কোনও বিষয় রক্ষা করেন। এমনকি যদি থ্রেডটি মিটেক্সটি পায় এবং তারপরে এমন কোনও ফাংশন কল করে যা বস্তুটিকে আরও সংশোধন করে (এবং প্রোটেক্টরকে তার নিজের অপারেশনগুলির আশেপাশে রাখে / রাখে), অপারেশনগুলি এখনও নিরাপদ থাকা উচিত কারণ এগুলি সবই একটি থ্রেডের অধীনে ঘটছে।

{
    mutexGet();  // Other threads can no longer get the mutex.

    // Make changes to the protected object.
    // ...

    objectModify();  // Also gets/puts the mutex.  Only allowed from this thread context.

    // Make more changes to the protected object.
    // ...

    mutexPut();  // Finally allows other threads to get the mutex.
}

অবশ্যই, এই বৈশিষ্ট্যটি ব্যবহার করার সময়, আপনাকে অবশ্যই নিশ্চিত হতে হবে যে একক থ্রেডের মধ্যে সমস্ত অ্যাক্সেসগুলি সত্যই নিরাপদ!

আমি নিশ্চিত নই যে এই পদ্ধতিটি কতটা সাধারণ, বা আমার পরিচিত সিস্টেমগুলির বাইরে এটি প্রযোজ্য কিনা। এই ধরণের মিটেক্সের উদাহরণের জন্য থ্রেডএক্স আরটিওএস দেখুন।


2
Mutex বলছ ধরনের "রিকার্সিভ mutex" বলা হয় এবং যেহেতু তারা ধীর এবং খারাপ নকশা উন্নীত ঝোঁক এড়িয়ে চলা উচিত: (দেখুন ডেভিড Butenhof: zaval.org/resources/library/butenhof1.html )
gaspard

একমত। এই নির্দিষ্ট ওএসে, আমি মুটিেক্স পরিষেবাটি ব্যবহার করি যেখানে আমি এটি পরিষ্কার করতে চাই যে কোডটি "পারস্পরিক বর্জন" এর জন্য এবং রেফারেন্স গণনা নয়, তবে আমি কুৎসিত আনইন্ডিংয়ের ভয়ে পুনরাবৃত্তি বৈশিষ্ট্যটি ব্যবহার করি না। তবুও, প্রশ্নের প্রসঙ্গে, এটি একটি "মুটেক্স" এবং "বাইনারি সেমফোর" এর মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য।
কেসি বার্কার

1

মেটেক্সগুলির মালিকানা রয়েছে, সেমফোরগুলি থেকে আলাদা। যদিও কোনও থ্রেড, একটি মুটেক্সের আওতায়, একটি আনলক করা মুটেক্স এবং কোডের একই সমালোচনামূলক বিভাগে লক অ্যাক্সেস পেতে পারে, কেবল কেবল সেই থ্রেড যা মুটেক্সকে লক করে রাখা উচিত এটি আনলক করা উচিত


মালিকানা কী? আপনি যে প্রসঙ্গটি মুটিেক্স অর্জন করেন তা কেবল এটি অ্যাকোয়ার করতে পারে ??
রাউলপ

1

এখানে যেমন অনেক লোক উল্লেখ করেছেন, একটি মুটেক্স ব্যবহার করা হয়েছে একটি সমালোচনামূলক কোডের সুরক্ষার জন্য (একা সমালোচনা বিভাগ।) আপনি মুটেক্স (লক) অর্জন করবেন, সমালোচনা বিভাগে প্রবেশ করবেন এবং মুটেক্স (আনলক) সমস্ত একই থ্রেডে ছেড়ে দেবেন

একটি সেমফোর ব্যবহার করার সময়, আপনি একটি থ্রেড একটি সেমফোরে অপেক্ষা করতে পারেন (থ্রেড এ বলুন), যতক্ষণ না অন্য থ্রেড (থ্রেড বি বলুন) যে কোনও কাজ সম্পন্ন না করে, এবং তারপরে থামা এটির জন্য সেমফোর সেট করে অপেক্ষাটি থামিয়ে দেয় এবং তার কাজটি চালিয়ে যায়।


1

সবচেয়ে ভালো সমাধান

পার্থক্য একটাই

1. মিউটেক্স -> লক এবং আনলকটি এমন থ্রেডের মালিকানাধীন যা মুটেক্সকে লক করে রাখে।

2.Semaphore -> মালিকানা নেই অর্থাৎ; যদি একটি থ্রেড সেমওয়েট (গুলি) কে কল করে অন্য কোনও থ্রেডটি লকটি সরাতে সেম্পস্ট (গুলি) কল করতে পারে।


1

mutex

সম্প্রতি অবধি, কার্নেলের একমাত্র স্লিপিং লকটি ছিল সেমফোর। সেমফোরসের বেশিরভাগ ব্যবহারকারী একটি জনের সাথে একটি সেমফোর ইনস্ট্যান্ট করেছিলেন এবং তাদেরকে মিউচুয়াল এক্সক্লুশন লক হিসাবে গণ্য করেছিলেন the স্পিন-লকের একটি ঘুমন্ত সংস্করণ। দুর্ভাগ্যক্রমে, semaphores বরং জেনেরিক এবং কোনও ব্যবহারের সীমাবদ্ধতা চাপায় না। এটি তাদেরকে অস্পষ্ট পরিস্থিতিতে একচেটিয়া অ্যাক্সেস পরিচালনার জন্য দরকারী করে যেমন কার্নেল এবং ইউজারস্পেসের মধ্যে জটিল নাচ। তবে এর অর্থ হ'ল সহজ লকিং করা আরও কঠিন, এবং প্রয়োগের নিয়মের অভাবে কোনও ধরণের স্বয়ংক্রিয় ডিবাগিং বা সীমাবদ্ধ প্রয়োগ কার্যকর করা অসম্ভব হয়ে পড়ে। একটি সহজ স্লিপিং লক খুঁজছেন, কার্নেল বিকাশকারীরা মিউটেক্সটি উপস্থাপন করলেন es হ্যাঁ, আপনি এখন যেমন অভ্যস্ত, এটি একটি বিভ্রান্তিকর নাম। আসুন আমরা স্পষ্ট করে বলি mutual "মুটেক্স" শব্দটি একটি সাধারণ নাম যা কোনও ঘুমের লককে বোঝায় যা পারস্পরিক বর্জনকে বাধ্য করে, যেমন একটি ব্যবহারের গণনা সহ সেমফোর। সাম্প্রতিক লিনাক্স কার্নেলগুলিতে, যথাযথ বিশেষ্য "মুটেক্স" এখন একটি নির্দিষ্ট ধরণের স্লিপিং লক যা পারস্পরিক বর্জনকে কার্যকর করে। এটি হ'ল একটি মিউেক্স একটি মিউটেক্স।

মুটেক্সের সরলতা এবং দক্ষতা সেমফোরের যা প্রয়োজন তার উপরে এবং তার উপরে তার ব্যবহারকারীদের উপর আরোপিত অতিরিক্ত বাধা থেকে আসে। একটি সেমফোরের বিপরীতে, যা ডিজকস্ট্রার মূল নকশা অনুসারে আচরণের সবচেয়ে মৌলিক আচরণকে বাস্তবায়িত করে, মিউটেক্সের আরও কঠোর, সংকীর্ণ ব্যবহারের ক্ষেত্রে রয়েছে: n একসময় কেবলমাত্র একটি কার্য মুটিেক্সকে ধরে রাখতে পারে। অর্থাত্, একটি মিটেক্সে ব্যবহারের সংখ্যা সর্বদা এক is

  1. যে কেউ একটি মিটেক্সকে লক করেছে তাকে অবশ্যই এটি আনলক করতে হবে। অর্থাৎ, আপনি একটি প্রসঙ্গে মুটেক্সকে লক করতে পারবেন না এবং তারপরে অন্যটিতে আনলক করতে পারবেন না। এর অর্থ মিটেক্স কার্নেল এবং ব্যবহারকারী-স্থানের মধ্যে আরও জটিল সিঙ্ক্রোনাইজেশনের জন্য উপযুক্ত নয়। তবে বেশিরভাগ ব্যবহারের ক্ষেত্রে একই প্রসঙ্গটি পরিষ্কারভাবে লক এবং আনলক করা হয়।
  2. পুনরাবৃত্ত হওয়া লক এবং আনলকগুলি অনুমোদিত নয়। এটি হ'ল আপনি পুনরাবৃত্তভাবে একই মিটেক্সটি অর্জন করতে পারবেন না এবং আপনি আনলক করা মিটেক্সকে আনলক করতে পারবেন না।
  3. মিউটেক্স ধরে রাখার সময় কোনও প্রক্রিয়া প্রস্থান করতে পারে না।
  4. একটি মিউটেক্স কোনও বিঘ্নিত হ্যান্ডলার বা নীচের অর্ধেক এমনকি মুটেেক্স_ট্রিলক () এর মাধ্যমেও অধিগ্রহণ করা যাবে না।
  5. একটি মুটেক্স কেবলমাত্র অফিসিয়াল এপিআইয়ের মাধ্যমে পরিচালিত হতে পারে: এটি অবশ্যই এই বিভাগে বর্ণিত পদ্ধতিগুলির মাধ্যমে আরম্ভ করা উচিত এবং অনুলিপি করা, হাত আরম্ভ করা বা পুনরায় পুনঃনির্মাণ করা যাবে না।

[1] লিনাক্স কার্নেল বিকাশ, তৃতীয় সংস্করণ রবার্ট লাভ


1

আমি মনে করি এখানে বেশিরভাগ উত্তরগুলি বিভ্রান্তিকর ছিল বিশেষত যারা বলেছিল যে মুটেেক্স কেবল এটির প্রক্রিয়া দ্বারা প্রকাশ করা যেতে পারে তবে সেমফোরটি অ্যায় প্রক্রিয়া দ্বারা সংকেত দেওয়া যেতে পারে। উপরের লাইনটি সেমফোরের ক্ষেত্রে এক ধরণের অস্পষ্ট। বোঝার জন্য আমাদের জানতে হবে যে দুটি ধরণের সেমফোর রয়েছে একটির নাম গণনা সেমফোর এবং অন্যটিকে বাইনারি সেমফোর বলা হয়। সেমফোর গণনায় n সংখ্যার সংস্থানগুলিতে অ্যাক্সেস পরিচালনা করে যেখানে n ব্যবহারের আগে সংজ্ঞায়িত করা যায়। প্রতিটি semaphore একটি গণনা ভেরিয়েবল রয়েছে, যা ব্যবহারে সংস্থান হিসাবে সংখ্যার গণনা রাখে, প্রাথমিকভাবে, এটি এন সেট করা হয়। প্রতিটি প্রক্রিয়া যা কোনও সংস্থান ব্যবহার করতে চায় সেমফোরে ওয়েট () অপারেশন করে (যার মাধ্যমে গণনা হ্রাস করা হয়)। যখন কোনও প্রক্রিয়া কোনও সংস্থান প্রকাশ করে, তখন এটি একটি রিলিজ () অপারেশন করে (গণনা বৃদ্ধি করে)। গণনা যখন 0 হয়, সমস্ত সংস্থান ব্যবহার করা হচ্ছে। এর পরে, প্রক্রিয়াটি গণনা 0 এর চেয়ে বেশি হয়ে ওঠার আগে পর্যন্ত অপেক্ষা করে Now এখন এখানে কেবল ক্যাচটিই কেবল প্রক্রিয়াটি সংস্থানকে বাড়িয়ে তুলতে পারে অন্য কোনও প্রক্রিয়া গণনা বাড়াতে পারে না কেবল কোনও উত্স ধারণকারী প্রক্রিয়াগুলি গণনা এবং প্রক্রিয়া বৃদ্ধি করতে পারে সেম্যাফোরের জন্য অপেক্ষা করে আবার চেক করে এবং যখন এটি উপলব্ধ সংস্থানটি দেখায় এটি আবার গণনা হ্রাস করে। সুতরাং বাইনারি সেমফোরের ক্ষেত্রে, কেবলমাত্র সেমফোরটি ধরে রাখার প্রক্রিয়াটি গণনা বাড়িয়ে তুলতে পারে এবং সেমফোরটি ব্যবহার বন্ধ না করা এবং গণনা বৃদ্ধি করা এবং অন্যান্য প্রক্রিয়াটি সেমফোর অ্যাক্সেস করার সুযোগ না পাওয়া পর্যন্ত গণনা শূন্য থেকে যায়। এখন এখানে ধরা কেবলমাত্র সেই প্রক্রিয়া যা সংস্থান বাড়িয়ে তুলতে পারে অন্য কোনও প্রক্রিয়া গণনা বাড়াতে পারে না কেবল কোনও উত্স ধারণকারী প্রক্রিয়াগুলি গণনা বাড়াতে পারে এবং সেমফোরের অপেক্ষায় থাকা প্রক্রিয়াটি আবার পরীক্ষা করে এবং যখন এটি উপলব্ধ সংস্থানটি উপলব্ধ দেখায় আবার গণনা হ্রাস। সুতরাং বাইনারি সেমফোরের ক্ষেত্রে, কেবলমাত্র সেমফোরটি ধরে রাখার প্রক্রিয়াটি গণনা বাড়িয়ে তুলতে পারে এবং সেমফোরটি ব্যবহার বন্ধ না করা এবং গণনা বৃদ্ধি করা এবং অন্যান্য প্রক্রিয়াটি সেমফোর অ্যাক্সেস করার সুযোগ না পাওয়া পর্যন্ত গণনা শূন্য থেকে যায়। এখন এখানে ধরা কেবলমাত্র সেই প্রক্রিয়া যা সংস্থান বাড়িয়ে তুলতে পারে অন্য কোনও প্রক্রিয়া গণনা বাড়াতে পারে না কেবল কোনও উত্স ধারণকারী প্রক্রিয়াগুলি গণনা বাড়াতে পারে এবং সেমফোরের অপেক্ষায় থাকা প্রক্রিয়াটি আবার পরীক্ষা করে এবং যখন এটি উপলব্ধ সংস্থানটি উপলব্ধ দেখায় আবার গণনা হ্রাস। সুতরাং বাইনারি সেমফোরের ক্ষেত্রে, কেবলমাত্র সেমফোরটি ধরে রাখার প্রক্রিয়াটি গণনা বাড়িয়ে তুলতে পারে এবং সেমফোরটি ব্যবহার বন্ধ না করা এবং গণনা বৃদ্ধি করা এবং অন্যান্য প্রক্রিয়াটি সেমফোর অ্যাক্সেস করার সুযোগ না পাওয়া পর্যন্ত গণনা শূন্য থেকে যায়।

বাইনারি সেম্যাফোর এবং মিটেক্সের মধ্যে প্রধান পার্থক্যটি হ'ল সেমফোর একটি সংকেত প্রক্রিয়া এবং মিউটেক্স একটি লকিং মেকানিজম, তবে বাইনারি সেম্যাফোরটি মুটেক্সের মতো কাজ করে যা বিভ্রান্তি সৃষ্টি করে, তবে উভয়ই বিভিন্ন ধরণের কাজের জন্য উপযুক্ত বিভিন্ন ধারণা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.