লক, মিটেক্স, সেমফোর… পার্থক্য কী?


439

আমি সমকালীন প্রোগ্রামিং সম্পর্কিত এই শব্দগুলি শুনেছি, তবে তাদের মধ্যে পার্থক্য কী?



2
আমি এর আগে সবচেয়ে ভাল ব্যাখ্যাটি দেখেছি: crystal.uta.edu/~ylei/cse6324/data/semaphore.pdf
expoter

উত্তর:


534

একটি লক লক করা অংশটিতে কেবল একটি থ্রেড প্রবেশ করতে দেয় এবং লকটি অন্য কোনও প্রক্রিয়ার সাথে ভাগ করা হয় না।

একটি মিউটেক্সটি লকের মতো একই তবে এটি সিস্টেমের প্রশস্ত হতে পারে (একাধিক প্রক্রিয়া দ্বারা ভাগ করা)।

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

মিটেক্স এবং সেমফোরের পার্থক্য সম্পর্কে আরও বিস্তারিত পোস্টের জন্য এখানে পড়ুন

আপনার কাছে পঠন / লিখনের তালিকাগুলিও রয়েছে যা সীমিত সীমাহীন পাঠকদের বা যেকোন সময় 1 জন লেখককে অনুমতি দেয়।


2
@মার্টিনান আমি বলতে পারি না যে আমি এর আগে কখনও শুনেছি, তবে উইকিপিডিয়াতে "লাচ (ডাটাবেস), (একটি তুলনামূলক স্বল্প-জীবনকালীন) একটি সূচকের মতো সিস্টেমের ডেটা কাঠামোতে লক করা আছে"
পিটার

2
মনিটর একটি নির্দিষ্ট শর্ত (যেমন লক প্রকাশিত হয়), "মনিটর" অপেক্ষা করার অনুমতি দেয়।
ডিজিট্রি লেজারকা

25
একটি সেমফোর মিউটেক্সের মতো নয়। এগুলি খুব আলাদাভাবে ব্যবহৃত হয় এবং এর বিভিন্ন বৈশিষ্ট্যও রয়েছে (যেমন মালিকানার বিষয়ে)। উদাহরণস্বরূপ দেখুন barrgroup.com/Embedded-Systems/How-To/RTOS-Mutex-Semaphore বিস্তারিত জানার জন্য
nanoquack

3
আপনি যদি মনে করেন যে এটি বিভ্রান্তিকর বা ভুল @
পিটার

3
ন্যানাকোয়াকের লিঙ্কে মিউটেক্স এবং সেমফোরের স্পষ্ট পার্থক্যের জন্য মূল অনুচ্ছেদটি হ'ল একটি সেমফোরের সঠিক ব্যবহারটি একটি কাজ থেকে অন্য কাজকে সংকেত দেওয়ার জন্য। কাজের ভাগ সম্পদ এটা রক্ষা করে ব্যবহার করে বিপরীতে যে কাজগুলো ব্যবহার semaphores পারেন সংকেত বা অপেক্ষার নয় উভয়।। "
ToolmakerSteve

117

এই শব্দগুলি সম্পর্কে প্রচুর ভুল ধারণা রয়েছে।

এটি পূর্ববর্তী পোস্টের ( https://stackoverflow.com/a/24582076/3163691 ) যা এখানে চমত্কার মানায়:

1) সমালোচনামূলক বিভাগ = ব্যবহারকারীর অবজেক্ট একই প্রক্রিয়াতে অন্য অনেকের কাছ থেকে মাত্র একটি সক্রিয় থ্রেড কার্যকর করতে দেয় । অন্যান্য অ নির্বাচিত থ্রেডগুলি (@ এই বস্তুটি অর্জন করে) ঘুমিয়ে দেওয়া হয়েছে

[কোনও আন্তঃক্রিয়া ক্ষমতা, খুব আদিম বস্তু নয়]।

২) মুটেক্স সেম্যাফোর (ওরফে মুটেক্স) = কার্নেল অবজেক্টটি বিভিন্ন প্রক্রিয়াগুলির মধ্যে , অন্য অনেকের থেকে কেবলমাত্র একটি সক্রিয় থ্রেড কার্যকর করার অনুমতি দেওয়ার জন্য ব্যবহৃত হয় । অন্যান্য অ নির্বাচিত থ্রেডগুলি (@ এই বস্তুটি অর্জন করে) ঘুমিয়ে দেওয়া হয়েছে । এই অবজেক্টটি থ্রেডের মালিকানা, থ্রেড সমাপ্তি বিজ্ঞপ্তি, পুনরাবৃত্তি (একই থ্রেড থেকে একাধিক 'অর্জন' কল) এবং 'অগ্রাধিকার বিপরীতমুখী পরিহার' সমর্থন করে।

[আন্তঃসম্পূর্ণ ক্ষমতা, ব্যবহার করা খুব নিরাপদ, এক ধরণের 'উচ্চ স্তরের' সিঙ্ক্রোনাইজেশন অবজেক্ট]।

3) সেমাফোর গণনা করা (ওরফে সেমাফোর) = কার্নেল অবজেক্ট যা অন্য অনেকের কাছ থেকে সক্রিয় থ্রেডগুলির একটি গোষ্ঠী কার্যকর করার অনুমতি দেয়। অন্যান্য অ নির্বাচিত থ্রেডগুলি (@ এই বস্তুটি অর্জন করে) ঘুমিয়ে দেওয়া হয়েছে

[ইন্টারপ্রেসেস সক্ষমতা তবে ব্যবহারের পক্ষে খুব বেশি নিরাপদ নয় কারণ এতে 'মিটেক্স' বৈশিষ্ট্যগুলির অভাব রয়েছে: থ্রেড সমাপ্তি বিজ্ঞপ্তি, পুনরাবৃত্তি ?, 'অগ্রাধিকার বিপর্যয় এড়ানো' ?, ইত্যাদি]]

৪) এবং এখন 'স্পিনলকস' নিয়ে কথা বলছি, প্রথমে কিছু সংজ্ঞা:

সমালোচনামূলক অঞ্চল = 2 বা ততোধিক প্রক্রিয়া দ্বারা ভাগ করা মেমরির একটি অঞ্চল।

লক = একটি পরিবর্তনশীল যার মান 'জটিল অঞ্চলে' প্রবেশের অনুমতি দেয় বা অস্বীকার করে। (এটি সাধারণ 'বুলিয়ান পতাকা' হিসাবে প্রয়োগ করা যেতে পারে)।

ব্যস্ত ওয়েটিং = কিছু মান উপস্থিত না হওয়া পর্যন্ত একটি চলকটির ধারাবাহিকভাবে পরীক্ষা করা।

অবশেষে:

স্পিন-লক (ওরফে স্পিনলক) = একটি লক যা ব্যস্ততার জন্য অপেক্ষা করে । ( লকটি অর্জন এক্সএইচজি বা অনুরূপ পারমাণবিক ক্রিয়াকলাপ দ্বারা তৈরি করা হয় )।

[কোনও থ্রেড ঘুমন্ত নয়, বেশিরভাগ ক্ষেত্রে কেবল কার্নেল স্তরে ব্যবহৃত হয়। ব্যবহারকারী স্তরের কোডের জন্য অজ্ঞাত]।

একটি সর্বশেষ মন্তব্য হিসাবে, আমি নিশ্চিত নই তবে আমি আপনাকে কয়েকটি বড় টাকা বাজি ধরতে পারি যে উপরের প্রথম 3 টি সিঙ্ক্রোনাইজ করা অবজেক্ট (# 1, # 2 এবং # 3) তাদের বাস্তবায়নের অংশ হিসাবে এই সাধারণ জানোয়ার (# 4) ব্যবহার করে।

আপনার দিনটি শুভ হোক!.

তথ্যসূত্র:

ক্যারলিন ইয়াও (সিএমপি বুকস) সহ কিং লি দ্বারা এমবেডড সিস্টেমগুলির জন্য রিয়েল-টাইম ধারণাগুলি।

-অর্ড্রু টেনেনবাউম (পিয়ারসন এডুকেশন ইন্টারন্যাশনাল) দ্বারা মোডার্ন অপারেটিং সিস্টেম (3 য়)

জেফ্রি রিচার (মাইক্রোসফ্ট প্রোগ্রামিং সিরিজ) দ্বারা মাইক্রোসফ্ট উইন্ডোজ (4 র্থ) এর জন্য প্রোগ্রামিং অ্যাপ্লিকেশন।

এছাড়াও, আপনি এটিকে একবার দেখে নিতে পারেন: https://stackoverflow.com/a/24586803/3163691


1
আসলে সমালোচনামূলক অধ্যায় না একটি কার্নেল বস্তু, এইভাবে আরও হাল্কা ও প্রসেস জুড়ে সিঙ্ক্রোনাইজ অসমর্থ।
ভ্লাদিস্লাভস বুরাকভস

2
@ ভ্লাদিস্লাভস বুরাকভস: আপনি ঠিক বলেছেন! আমার প্রতিক্রিয়া ক্ষমা করুন। একাত্মতার জন্য আমি এটি ঠিক করব fix
fante

নাইটোক্যাকের অন্য কোথাও উল্লেখ করার সাথে সাথে মিউটেক্স এবং সেমফোরের মধ্যে স্পষ্ট পার্থক্যের জন্য, ব্যারগ্রুপ / এম্বেডড - সিস্টেমগুলি দেখুন / কী করুন -আরটিওএস- মিউটেক্স- সেম্যাফোর - মূল অনুচ্ছেদটি " একটি কাজ থেকে সংকেত দেওয়ার জন্য একটি সেমফোরের সঠিক ব্যবহার হয় অন্যটিতে। একটি মিউটেক্সকে বোঝানো এবং ছেড়ে দেওয়া বোঝানো হয়, সর্বদা সেই ক্রমে, প্রতিটি কাজ যা ভাগ করে নেওয়া সংস্থান ব্যবহার করে এটি সুরক্ষিত করে contrast বিপরীতভাবে, যে কাজগুলি সেমফোরাসগুলি ব্যবহার করে সেগুলি সিগন্যাল দেয় বা অপেক্ষা করে both উভয়ই নয় ""
টুলমেকারস্টেটিভ

পুনরায় অনুমান করা অন্যান্য লক প্রক্রিয়াগুলি [অদক্ষ] স্পিনলকের উপর নির্মিত: অসম্ভব; আফাইকের জন্য কেবল কিছু পরমাণু অপারেশন প্লাস ঘুমের সারি প্রয়োজন need এমনকি যেখানে spinlock হয় কার্নেল ভিতরে প্রয়োজন, আধুনিক সমাধান বর্ণনা অনুযায়ী তার প্রভাব কমান Spinlock - - বিকল্প উইকিপিডিয়া - " অভিযোজিত mutex" .. নামক একটি সংকর পদ্ধতির ব্যবহার করুন "ধারণা যখন একটি সম্পদ দ্বারা লক অ্যাক্সেস করার চেষ্টা একটি spinlock ব্যবহার করা হয়। বর্তমানে চলমান থ্রেড, তবে থ্রেডটি চলমান না থাকলে ঘুমানোর জন্য ((পরেরটি সর্বদা একক-প্রসেসর সিস্টেমে ক্ষেত্রে থাকে)) "
টুলমেকারস্টেভ

@ টলমেকারস্টেভ, আমি আপনাকে 'স্লাইড সারি'তে একটি থ্রেড আইডি''োকানোর 'চেষ্টা করার সময়' সংঘর্ষের 'সমস্যার জন্য' স্পিনলক 'ছাড়াই একটি' সমাধান 'দেওয়ার সাহস দিচ্ছি। যাইহোক, উইকিপিডিয়া পাঠ্যটি উপসংহারে এসেছে যে বাস্তবায়নে একটি স্পিনলক ব্যবহার করা হয় !!!
fante

27

বেশিরভাগ সমস্যা সমাধান করা যেতে পারে (i) কেবল তালা, (ii) কেবলমাত্র সেমফোরস, ..., বা (iii) উভয়ের সংমিশ্রণ! যেমন আপনি আবিষ্কার করেছেন, সেগুলি খুব একইরকম: উভয়ই বর্ণের অবস্থার প্রতিরোধ করে , উভয়ই acquire()/ release()অপারেশন করে, উভয়ই শূন্য বা ততোধিক থ্রেডকে অবরুদ্ধ / সন্দেহযুক্ত করে তোলে ... সত্যই, গুরুত্বপূর্ণ পার্থক্য কেবলমাত্র তারা কীভাবে লক এবং আনলক করে তাতেই থাকে

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

উভয় লক / সেমফোরের জন্য, acquire()আদিম 0 টি অবস্থায় থাকাকালীন কল করার চেষ্টা করার ফলে আহ্বানকারী থ্রেড স্থগিত হয়ে যায়। লকগুলির জন্য - লকটি অর্জনের প্রচেষ্টা 1 রাজ্যে রয়েছে সফল। সেমোফোরগুলির জন্য - 1 টি লকটি অর্জনের প্রচেষ্টা {1, 2, 3, ...। সফল।

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

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


যে কারণে প্রচুর বিভ্রান্তির সৃষ্টি হয় তা হ'ল, বাস্তবে তারা এই উচ্চ-স্তরের সংজ্ঞাটির অনেকগুলি প্রকরণ

বিবেচনা করার জন্য গুরুত্বপূর্ণ বৈচিত্রগুলি :

  • কি করা উচিত acquire()/ release()বলা যেতে? - [ ব্যাপকভাবে পরিবর্তিত হয় ]
  • আপনার লক / সেম্যাফোরটি থ্রেডগুলির অপেক্ষার জন্য "কিউ" বা "সেট" ব্যবহার করে?
  • আপনার লক / সেমফোর অন্যান্য প্রক্রিয়াগুলির থ্রেডের সাথে ভাগ করা যায়?
  • আপনার লকটি কি "প্রেরণকারী"? - [সাধারণত হ্যাঁ]
  • আপনার লকটি কি "ব্লকিং / অ-ব্লকিং" করছে? - [সাধারণত অবরুদ্ধকরণগুলি অবরুদ্ধ লক হিসাবে ব্যবহার করা হয় (ওরফে স্পিন-লক) ব্যস্ততার জন্য অপেক্ষা করে]
  • কীভাবে আপনি অপারেশনগুলি "পারমাণবিক" নিশ্চিত করেন?

এগুলি আপনার বই / প্রভাষক / ভাষা / গ্রন্থাগার / পরিবেশের উপর নির্ভর করে।
কিছু ভাষা কীভাবে এই বিবরণগুলির জবাব দেয় তা এখানে লক্ষ করার জন্য এখানে একটি দ্রুত সফর tour


সি, সি ++ ( pthreads )

  • একটি মিটেক্স মাধ্যমে প্রয়োগ করা হয় pthread_mutex_t। ডিফল্টরূপে, এগুলি অন্য কোনও প্রক্রিয়া ( PTHREAD_PROCESS_PRIVATE) এর সাথে ভাগ করা যায় না , তবে মিটেক্সের pharered বলে একটি বৈশিষ্ট্য রয়েছে । সেট করা থাকলে, তাই মিটেক্সগুলি প্রক্রিয়াগুলির ( PTHREAD_PROCESS_SHARED) মধ্যে ভাগ করা হয় ।
  • একটি লক একটি mutex হিসাবে একই জিনিস।
  • একটি semaphore মাধ্যমে প্রয়োগ করা হয় sem_t। মিউটেক্সেসের মতো, সেমোফোরগুলি অনেকগুলি প্রক্রিয়া ত্রিশাদের মধ্যে ভাগ করা যায় বা একক প্রক্রিয়ার থ্রেডগুলিতে ব্যক্তিগত রাখা যেতে পারে। এটি প্রদত্ত pshared যুক্তির উপর নির্ভর করে sem_init

অজগর ( থ্রেডিং.পি )

  • একটি লক ( threading.RLock) বেশিরভাগ সি / সি ++ pthread_mutex_tএর সমান । দু'জনেই প্রেরণকারী । এর অর্থ তারা কেবল একই থ্রেড দ্বারা তালাবদ্ধ হয়ে থাকতে পারে যা এটি লক করে। এটি sem_tসেমফোরস, threading.Semaphoreসেমফোরস এবং theading.Lockলকগুলি পুনরায় প্রেরণকারী নয় - এটি কোনও ক্ষেত্রে থ্রেডটি আনলকটি সম্পাদন করতে পারে / সেমফোরের নিচে।
  • একটি মিউটেক্স হ'ল লকের মতো (শব্দটি পাইথনটিতে প্রায়শই ব্যবহৃত হয় না)।
  • একটি semaphore ( threading.Semaphore) বেশিরভাগ হিসাবে একই sem_t। যদিও এর সাথে sem_t, থ্রেড আইডগুলির একটি সারিটি ক্রমটি মনে করতে ব্যবহৃত হয় যাতে লক করার সময় থ্রেডগুলি লক করার চেষ্টা করার সময় এটি ব্লক হয়ে গিয়েছিল। যখন কোনও থ্রেড একটি সেমফোর আনলক করে, কাতারে প্রথম থ্রেড (যদি সেখানে থাকে) নতুন মালিক হিসাবে বেছে নেওয়া হয়। থ্রেড আইডেন্টিফায়ারটিকে কাতারে নেওয়া হয় এবং সেমফোরটি আবার লক হয়ে যায়। তবে, এর সাথে threading.Semaphoreএকটি কাতারের পরিবর্তে একটি সেট ব্যবহৃত হয়, সুতরাং যে ক্রমে থ্রেডগুলি ব্লক হয়ে গেছে সেটিকে সংরক্ষণ করা হয় না - সেটের কোনও থ্রেড পরবর্তী মালিক হিসাবে বেছে নেওয়া যেতে পারে।

জাভা ( java.util.concurrent )

  • একটি লক ( java.util.concurrent.ReentrantLock) বেশিরভাগই সি / সি ++ pthread_mutex_tএর মতো এবং পাইথন এর threading.RLockমধ্যে এটি একটি প্রবর্তক লকটি প্রয়োগ করে। জাভিতে মধ্যস্থতাকারী হিসাবে অভিনয় করার কারণে জাভাতে প্রক্রিয়াগুলির মধ্যে লকগুলি ভাগ করা আরও শক্ত। যদি কোনও থ্রেড কোনও লকটি আনলক করার চেষ্টা করে তবে এটি নিজস্ব নয়, একটি IllegalMonitorStateExceptionনিক্ষেপ করা হয়।
  • একটি মিউটেক্স হ'ল লকের মতো (শব্দটি জাভাতে প্রায়শই ব্যবহৃত হয় না)।
  • একটি semaphore ( java.util.concurrent.Semaphore) বেশিরভাগ হিসাবে sem_tএবং একই threading.Semaphore। জাভা সেমোফোরস এর কনস্ট্রাক্টর একটি ফেয়ারনেস বুলিয়ান প্যারামিটার গ্রহণ করে যা ওয়েটিং থ্রেডগুলি স্টোর করার জন্য কোনও সেট (মিথ্যা) বা একটি সারি (সত্য) ব্যবহার করবে কিনা তা নিয়ন্ত্রণ করে।

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


22

জন কোপলিনের মাল্টিথ্রেডিং টিউটোরিয়ালটি একবার দেখুন ।

থ্রেডগুলির মধ্যে সিনক্রোনাইজেশন বিভাগে তিনি ইভেন্ট, লক, মিটেক্স, সেমফোর, অপেক্ষারত টাইমারের মধ্যে পার্থক্য বর্ণনা করেছেন

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

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

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

একটি সেমফোর শূন্য এবং কিছু সর্বাধিক মানের মধ্যে একটি গণনা বজায় রাখে, একসাথে একটি ভাগ করা সংস্থান অ্যাক্সেস করছে এমন থ্রেডের সংখ্যা সীমাবদ্ধ করে।


15

আমি উদাহরণ সহ এটি আবরণ করার চেষ্টা করব:

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

private static readonly Object obj = new Object();

lock (obj) //after object is locked no thread can come in and insert item into dictionary on a different thread right before other thread passed the check...
{
    if (!sharedDict.ContainsKey(key))
    {
        sharedDict.Add(item);
    }
}

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

কোড উদাহরণ যে আমি পছন্দ করি তা @ পেট্রিকের দেওয়া বাউন্সারগুলির মধ্যে একটি - এটি এখানে যায়:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace TheNightclub
{
    public class Program
    {
        public static Semaphore Bouncer { get; set; }

        public static void Main(string[] args)
        {
            // Create the semaphore with 3 slots, where 3 are available.
            Bouncer = new Semaphore(3, 3);

            // Open the nightclub.
            OpenNightclub();
        }

        public static void OpenNightclub()
        {
            for (int i = 1; i <= 50; i++)
            {
                // Let each guest enter on an own thread.
                Thread thread = new Thread(new ParameterizedThreadStart(Guest));
                thread.Start(i);
            }
        }

        public static void Guest(object args)
        {
            // Wait to enter the nightclub (a semaphore to be released).
            Console.WriteLine("Guest {0} is waiting to entering nightclub.", args);
            Bouncer.WaitOne();          

            // Do some dancing.
            Console.WriteLine("Guest {0} is doing some dancing.", args);
            Thread.Sleep(500);

            // Let one guest out (release one semaphore).
            Console.WriteLine("Guest {0} is leaving the nightclub.", args);
            Bouncer.Release(1);
        }
    }
}

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

বিশ্বব্যাপী মিটেক্স তৈরির জন্য ভাল উদাহরণটি হ'ল @ ডিপি

class SingleGlobalInstance : IDisposable
{
    public bool hasHandle = false;
    Mutex mutex;

    private void InitMutex()
    {
        string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString();
        string mutexId = string.Format("Global\\{{{0}}}", appGuid);
        mutex = new Mutex(false, mutexId);

        var allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow);
        var securitySettings = new MutexSecurity();
        securitySettings.AddAccessRule(allowEveryoneRule);
        mutex.SetAccessControl(securitySettings);
    }

    public SingleGlobalInstance(int timeOut)
    {
        InitMutex();
        try
        {
            if(timeOut < 0)
                hasHandle = mutex.WaitOne(Timeout.Infinite, false);
            else
                hasHandle = mutex.WaitOne(timeOut, false);

            if (hasHandle == false)
                throw new TimeoutException("Timeout waiting for exclusive access on SingleInstance");
        }
        catch (AbandonedMutexException)
        {
            hasHandle = true;
        }
    }


    public void Dispose()
    {
        if (mutex != null)
        {
            if (hasHandle)
                mutex.ReleaseMutex();
            mutex.Dispose();
        }
    }
}

তারপরে ব্যবহার করুন:

using (new SingleGlobalInstance(1000)) //1000ms timeout on global lock
{
    //Only 1 of these runs at a time
    GlobalNodeList.Remove(node)
}

আশা করি এটি আপনার কিছুটা সময় সাশ্রয় করবে।


8

Semaphores এবং Mutexes এর মধ্যে পার্থক্য সম্পর্কে উইকিপিডিয়ায় একটি দুর্দান্ত বিভাগ রয়েছে :

একটি মিউটেক্স মূলত বাইনারি সেমফোর হিসাবে একই জিনিস এবং কখনও কখনও একই বেসিক বাস্তবায়ন ব্যবহার করে। তাদের মধ্যে পার্থক্যগুলি হ'ল:

মুটেক্সগুলির একটি মালিকের ধারণা রয়েছে, যা প্রক্রিয়াটি মিটেক্সকে লক করে দেয়। কেবলমাত্র প্রক্রিয়াটি যা মিটেক্সকে লক করেছে এটিই আনলক করতে পারে। বিপরীতে, একটি semaphore মালিক সম্পর্কে কোন ধারণা আছে। যে কোনও প্রক্রিয়া একটি সেমফোর আনলক করতে পারে।

সেমোফোরগুলির বিপরীতে, মিউটেক্সগুলি অগ্রাধিকারের বিপরীতে সুরক্ষা সরবরাহ করে। যেহেতু মুটেক্স তার বর্তমান মালিককে জানে তাই যখনই কোনও উচ্চ-অগ্রাধিকারের কার্যটি মুটেক্সের জন্য অপেক্ষা করা শুরু করে তখনই তার মালিকের অগ্রাধিকার প্রচার করা সম্ভব।

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


5

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

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

কেউ আমার ব্যাখ্যা যাচাই করতে পারে? আমি লিনাক্সের প্রসঙ্গে বলছি, বিশেষত রেড হ্যাট এন্টারপ্রাইজ লিনাক্স (আরএইচইল) সংস্করণ,, যা কার্নেল ২.6.৩২ ব্যবহার করে।


3
এখন এটি বিভিন্ন অপারেটিং সিস্টেমে ভিন্ন হতে পারে তবে উইন্ডোতে একটি Mutex একাধিক প্রক্রিয়া দ্বারা কমপক্ষে। নেট Mutex অবজেক্ট ব্যবহার করা যেতে পারে ..
পিটার

2
stackoverflow.com/questions/9389730/… "একই প্রক্রিয়াতে বা অন্যান্য প্রক্রিয়ার মধ্যে থ্রেডগুলি মিটেক্সগুলি ভাগ করতে পারে।" সুতরাং কোনও মুটেক্স অবশ্যই প্রক্রিয়া নির্দিষ্ট হতে হবে না।
পিটার

3

উদাহরণস্বরূপ একটি বেস কেস হিসাবে লিনাক্স ভেরিয়েন্টে সি প্রোগ্রামিং ব্যবহার করা।

লক:

Operation সাধারণত একটি খুব সাধারণ কন্ট্রাক্ট বাইনারি অপারেশনে হয় লকড বা আনলক করা হয়

Thread থ্রেডের মালিকানা, অগ্রাধিকার, সিকোয়েন্সিং ইত্যাদির কোনও ধারণা নেই

• সাধারণত একটি স্পিন লক যেখানে থ্রেড অবিচ্ছিন্নভাবে লকগুলির উপলব্ধতার জন্য পরীক্ষা করে।

• সাধারণত পারমাণবিক ক্রিয়াকলাপের উপর নির্ভর করে যেমন টেস্ট-অ্যান্ড-সেট, তুলনা-ও-সোয়াপ, আনতে এবং যোগ করা ইত্যাদি

At পারমাণবিক অপারেশনের জন্য সাধারণত হার্ডওয়্যার সমর্থন প্রয়োজন।

ফাইল লকস:

Multiple সাধারণত একাধিক প্রক্রিয়াগুলির মাধ্যমে কোনও ফাইলে অ্যাক্সেস সমন্বয় করতে ব্যবহৃত হয়।

• একাধিক প্রক্রিয়াগুলি রিড লকটি ধরে রাখতে পারে তবে যখন কোনও একক প্রক্রিয়া রাইটিং লক ধারণ করে তবে অন্য কোনও প্রক্রিয়াটি পড়ার বা লেখার লক অর্জনের অনুমতি দেয় না।

• উদাহরণ: ঝাঁক, fcntl ইত্যাদি।

mutex:

• Mutex ফাংশন কলগুলি সাধারণত কার্নেল স্পেসে কাজ করে এবং ফলস্বরূপ কল হয়।

• এটি মালিকানার ধারণাটি ব্যবহার করে। কেবলমাত্র থ্রেড যা বর্তমানে মুটেক্সকে ধরেছে এটি এটিকে আনলক করতে পারে।

• মুটেক্স পুনরাবৃত্ত হয় না (ব্যতিক্রম: PTHREAD_MUTEX_RECURSIVE)।

Cond সাধারণত কন্ডিশন ভেরিয়েবলের সাথে অ্যাসোসিয়েশনে ব্যবহৃত হয় এবং যুক্তি হিসাবে পাস করা হয় যেমন pthread_cond_signal, pthread_cond_wait ইত্যাদি to

• কিছু ইউনিক্স সিস্টেম একাধিক প্রক্রিয়া দ্বারা মিটেক্সকে ব্যবহার করার অনুমতি দেয় যদিও এটি সমস্ত সিস্টেমে প্রয়োগ করা নাও যেতে পারে।

সেমফোর্:

• এটি একটি কার্নেল রক্ষণাবেক্ষণ করা পূর্ণসংখ্যা যার মানগুলি শূন্যের নীচে নামার অনুমতি দেয় না।

• এটি প্রক্রিয়া সিঙ্ক্রোনাইজ করতে ব্যবহৃত হতে পারে।

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

• একটি সেম্যাফোর যার মান 1 এবং 0 এর মধ্যে সীমাবদ্ধ রয়েছে বাইনারি সেম্যাফোর হিসাবে উল্লেখ করা হয়।


0

Supporting ownership, maximum number of processes share lockএবং maximum number of allowed processes/threads in critical sectionতিনটি প্রধান কারণ যা সাধারণ নাম সহ সমবর্তী বস্তুর নাম / প্রকার নির্ধারণ করে lock। যেহেতু এই কারণগুলির মান বাইনারি (দুটি রাজ্য রয়েছে), তাই আমরা তাদের 3 - 8 সত্য-জাতীয় টেবিলে সংক্ষিপ্ত করতে পারি।

  • এক্স (মালিকানা সমর্থন করে?): না (0) / হ্যাঁ (1)
  • ওয়াই (# শেয়ারিং প্রক্রিয়া):> 1 (∞) / 1
  • জেড (# সিএসএতে # প্রক্রিয়া / থ্রেড):> 1 (∞) / 1

  X   Y   Z          Name
 --- --- --- ------------------------
  0   ∞   ∞   Semaphore              
  0   ∞   1   Binary Semaphore       
  0   1   ∞   SemaphoreSlim          
  0   1   1   Binary SemaphoreSlim(?)
  1   ∞   ∞   Recursive-Mutex(?)     
  1   ∞   1   Mutex                  
  1   1   ∞   N/A(?)                 
  1   1   1   Lock/Monitor           

এই টেবিলটি সম্পাদনা বা প্রসারিত নির্দ্বিধায়, আমি এটিকে সম্পাদনযোগ্য হওয়ার জন্য এ্যাসকি টেবিল হিসাবে পোস্ট করেছি :)

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