শর্তসাপেক্ষে ভেরিয়েবল বনাম সেমাফোর


110

কখন একজনকে সেমফোর ব্যবহার করা উচিত এবং কখন একটি শর্তসাপেক্ষ ভেরিয়েবল (কনডওয়ার) ব্যবহার করা উচিত?


1
সংশ্লিষ্ট তথ্য লিংক খুঁজে পাওয়া যেতে পারে stackoverflow.com/questions/4039899/...
কার্তিক Balaguru

উত্তর:


207

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

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

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

//pseudocode
while(!queue.empty())
{
   sleep(1);
}

এটির সাথে সমস্যাটি হ'ল আপনি বারবার এই থ্রেডটি শর্তটি পরীক্ষা করে প্রসেসরের সময় নষ্ট করছেন। পরিবর্তে কেন একটি সিঙ্ক্রোনাইজেশন ভেরিয়েবল নেই যা থ্রেডটি সংস্থান করতে পারে যে সংস্থানটি পাওয়া যায়?

//pseudocode
syncVar.lock.acquire();

while(!queue.empty())
{
   syncVar.wait();
}

//do stuff with queue

syncVar.lock.release();

সম্ভবতঃ, আপনার কাছে অন্য কোনও থ্রেড থাকবে যা জিনিসগুলিকে সারি থেকে সরিয়ে ফেলছে। যখন সারিটি খালি থাকে, তখন ঘুমোতে থাকা syncVar.signal()এলোমেলো সুতাকে জাগিয়ে তোলার জন্য এটি কল করতে পারে syncVar.wait()(অথবা সাধারণত অপেক্ষা করা সমস্ত থ্রেড জাগ্রত করার একটি উপায় signalAll()বা broadcast()পদ্ধতিও রয়েছে)।

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

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

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

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

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

wait()এবং signal()একটি সমন্বয়সাধন পরিবর্তনশীল পদ্ধতি মধ্যে আড়াল করা থাকে down()এবং up()সেমফোর্ অভিযান।

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

এটি অগত্যা সর্বাধিক প্রযুক্তিগত বিবরণ নয়, তবে এটি আমার মাথায় এটি কীভাবে উপলব্ধি করে।


9
দুর্দান্ত উত্তর, আমি অন্যান্য উত্তরগুলি থেকে যুক্ত করতে চাই: সেম্যাফোর চালানো থ্রেডের সংখ্যা নিয়ন্ত্রণ করতে ব্যবহৃত হয়। সংস্থার নির্দিষ্ট সেট থাকবে। থ্রেডের মালিকানাধীন প্রতিবার সম্পদ গণনা হ্রাস পাবে। যখন semaphore গণনা 0 পৌঁছে যায় তখন অন্য কোনও থ্রেড সংস্থান গ্রহণের অনুমতি দেয় না। অন্যান্য থ্রেডগুলির রিসোর্স রিলিজের মালিক হওয়া পর্যন্ত থ্রেডগুলি অবরুদ্ধ হয়ে যায়। সংক্ষেপে, মূল পার্থক্যটি হ'ল একসাথে কতগুলি থ্রেড সংস্থান গ্রহণ করার অনুমতি দেওয়া হয়? নীরবতা - এক এক। Semaphore - এর DEFINED_COUNT, (
যতগুলি

10
সরলতার পরিবর্তে লুপটি কেন রয়েছে তা কেবল এখানে ব্যাখ্যা করার জন্য: স্পুরিওস ওয়েকআপ নামক কিছু । এই উইকিপিডিয়া নিবন্ধটির উদ্ধৃতি দিয়ে : "এর অন্যতম কারণ
হ'ল উত্সাহী জাগরণ

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

আমি আশা করি যে সারিটি পূর্ণ না হওয়া পর্যন্ত আমি আপনাকে উত্তর দিয়েছি;) নিখুঁত উত্তর। এই কোডটি semaphores নির্ধারণে
মোহামাদ-জাফর NEHME

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

52

হুডের নীচে কী রয়েছে তা প্রকাশ করা যাক।

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

নোট করুন যে একটি শর্তাধীন ভেরিয়েবল ব্যবহার করতে, অন্য দুটি উপাদান প্রয়োজন:

  • একটি শর্ত (সাধারণত পতাকা বা কাউন্টার পরীক্ষা করে প্রয়োগ করা হয়)
  • শর্ত রক্ষা করে এমন একটি মিউটেক্স

প্রোটোকলটি তখন হয়ে যায়,

  1. mutex অর্জন
  2. শর্ত শর্ত
  3. শর্তটি সত্য হলে মিউটেক্সকে ব্লক করুন এবং ছেড়ে দিন, অন্যথায় মিটেক্স মুক্তি দিন

সেমফোর মূলত একটি পাল্টা + একটি মিউটেক্স + একটি ওয়েট সারি। এটি এটি বাহ্যিক নির্ভরতা ছাড়াই যেমন ব্যবহার করা যায়। আপনি এটি মুটিেক্স বা শর্তসাপেক্ষ ভেরিয়েবল হিসাবে ব্যবহার করতে পারেন।

অতএব, semaphore শর্তযুক্ত ভেরিয়েবলের চেয়ে আরও পরিশীলিত কাঠামো হিসাবে বিবেচনা করা যেতে পারে, তবে উত্তরোত্তর আরও হালকা ও নমনীয়।


শ্বেতকে কন্ডিশন ভেরিয়েবল হিসাবে দেখা যায়, এটি শর্তটি হোল্ড করা হবে কিনা।
: 李

18

ভেরিয়েবলগুলির একচেটিয়া অ্যাক্সেস প্রয়োগ করতে সেমোফোরগুলি ব্যবহার করা যেতে পারে, তবে সেগুলি সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয়। অন্যদিকে, মিউটেক্সগুলি একটি শব্দার্থবিজ্ঞান রয়েছে যা পারস্পরিক বর্জনের সাথে কঠোরভাবে সম্পর্কিত: কেবলমাত্র সেই প্রক্রিয়াটি যা সংস্থানটিকে লক করে রেখেছিল তা এটিকে আনলক করার অনুমতি দেয়।

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


9

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

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

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


1

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

আমি মনিটর ফর্ম দিকে কোড প্রবণতা; বেশিরভাগ ভাষায় আমি যে ভাষায় কাজ করি তা নীচে নেমে আসে নিঃশব্দ, শর্ত ভেরিয়েবল এবং কিছু ব্যাকিং স্টেট ভেরিয়েবল। কিন্তু semaphores খুব কাজ করবে।


2
"মনিটরের ফর্ম" কী তা আপনি যদি ব্যাখ্যা করেন তবে এটি আরও ভাল উত্তর হবে।
স্টিভেন লু

0

mutexএবং conditional variablesসুত্রে প্রাপ্ত semaphore

  • জন্য mutex, semaphoreব্যবহার দুটি রাজ্য: 0, 1
  • জন্য ব্যবহারসমূহ কাউন্টার।condition variablessemaphore

এগুলি সিনট্যাকটিক চিনির মতো


সি ++ স্ট্যান্ডার্ড লাইব্রেরিতে এগুলি সমস্ত জেলা অবজেক্ট, প্ল্যাটফর্ম নির্দিষ্ট API গুলি ব্যবহার করে প্রয়োগ করা হয়েছে। অবশ্যই একটি সেমফোর সিগন্যাল করা সংখ্যার সংখ্যাটি অবরোধ মুক্ত করবে, শর্ত পরিবর্তনশীল একাধিকবার সিগন্যাল করা হতে পারে তবে কেবল একবারে অবরোধ মুক্ত হবে। এই কারণেই ওয়্যার একটি প্যারামিটার হিসাবে একটি মিটেক্স গ্রহণ করে।
doron
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.