রিকার্সিভ লক (মুটেক্স) বনাম নন-রিকার্সিভ লক (মুটেক্স)


183

পসিক্স মুটেক্সকে পুনরাবৃত্ত হতে দেয়। তার মানে একই থ্রেড একই মুটেক্সকে দু'বার লক করতে পারে এবং অচলাবস্থায় থাকবে না। অবশ্যই এটি দুটি বার আনলক করা দরকার, অন্যথায় অন্য কোনও থ্রেড মিটেক্সটি অর্জন করতে পারে না। নেই সব ব্যবস্থা pthreads সমর্থনকারী এছাড়াও রিকার্সিভ mutexes সমর্থন করি, কিন্তু যদি তারা হতে চান POSIX সামঞ্জস্য, তারা আছে

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

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

এটি কি কেবলমাত্র ক্ষেত্রে, যেখানে আমি ঘটনাক্রমে দু'বার লক করে ফেলেছি এবং কেবল একবার এটি আনলক করেছি এবং পুনরাবৃত্তিকারী মুটেক্সের ক্ষেত্রে সমস্যাটি খুঁজে পাওয়া আরও কঠিন er তাই এর পরিবর্তে আমার তত্ক্ষণাত ত্রুটিযুক্ত লকটি উপস্থিত হওয়ার জন্য তা অচল করে দেওয়া আছে? তবে আনলক করার সময় এবং কোনও পরিস্থিতিতে যখন আমি নিশ্চিত যে আমি শেষ লকটি প্রকাশ করেছি এবং কাউন্টারটি শূন্য নয়, তখন আমি কোনও ব্যতিক্রম ছুঁড়ে দিতে পারি বা সমস্যাটি লগ করতে পারি, এমন কি আমি লক কাউন্টারটি ফিরে আসার সাথে কি করতে পারি না? বা আমি দেখতে ব্যর্থ নন পুনরাবৃত্ত mutexes এর অন্য কোন, দরকারী ব্যবহারের কেস আছে? বা এটি সম্ভবত কেবল পারফরম্যান্স হিসাবে, যেমন একটি পুনরাবৃত্তিকারী মুটেক্স একটি পুনরাবৃত্তির চেয়ে কিছুটা দ্রুত হতে পারে? তবে, আমি এটি পরীক্ষা করেছি এবং পার্থক্যটি আসলে এত বড় নয় not

উত্তর:


153

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

তবে এখানে খেলার ক্ষেত্রেও অন্যান্য বিবেচনা রয়েছে।

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

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

আপনি যদি ক্লাসিক ভেক্স ওয়ার্কস আরটিওএস কার্নেলটি উল্লেখ করেন তবে তারা তিনটি প্রক্রিয়া সংজ্ঞায়িত করে:

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

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


9
নন-রিকার্সিভ মিটেক্স সম্পর্কে আপনার ব্যাখ্যাটি আরও একটি সেমফোর মতো শোনাচ্ছে। একটি মিউটেক্সের (পুনরাবৃত্ত হওয়া বা অ-পুনরাবৃত্ত হওয়া উচিত) মালিকানার ধারণা আছে of
জে ডি

@ জায়েড এটি খুব বিভ্রান্তিকর হয় যখন লোকেরা এ জাতীয় বিষয়ে বিতর্ক করে .. সুতরাং এই বিষয়গুলি সংজ্ঞায়িতকারী সত্তা কে?
পেসারিয়ার

13
@ পেসিয়ার প্রাসঙ্গিক মান। এই উত্তরটি উদাহরণস্বরূপ পসিক্স (pthreads) এর জন্য ভুল, যেখানে থ্রেডটি লক করে রাখা থ্রেড ব্যতীত অন্য একটি থ্রেডে একটি সাধারণ মুটেক্সকে আনলক করা হয় তা সংজ্ঞায়িত আচরণ, যখন ত্রুটি পরীক্ষার মাধ্যমে পুনরাবৃত্তি করা বা পুনরাবৃত্তকারী ত্রুটি কোডের ফলাফল হিসাবে পুনরাবৃত্তি করে results অন্যান্য সিস্টেম এবং মানগুলি খুব আলাদা আচরণ করতে পারে।
টি

সম্ভবত এটি নিষ্পাপ, তবে আমি এই ধারণাটির মধ্যে ছিলাম যে একটি মিউেক্সের কেন্দ্রীয় ধারণাটি হ'ল লকিং থ্রেডটি মুটেক্সকে আনলক করে এবং তারপরে অন্যান্য থ্রেডগুলি একই কাজ করতে পারে। কম্পিউটিং.এলএনএল.
gov

2
@ কুরিয়াসগুয়ে - একটি সম্প্রচার বিজ্ঞপ্তি স্পষ্টতই সেমফোড়ে অবরুদ্ধ যে কোনও এবং সমস্ত থ্রেডকে মুক্ত করে দেয় (খালি থাকে) যেখানে একটি সাধারণ বাইনারি উপহার কেবল অপেক্ষার সারির মাথায় থ্রেডটি ছেড়ে দেয় (ধরে নিই যে একটি অবরুদ্ধ রয়েছে)।
লম্বা জেফ

122

উত্তরটি দক্ষতা নয় । অ-প্রেরণকারী মিউটেক্সগুলি আরও ভাল কোডের দিকে নিয়ে যায়।

উদাহরণ: এ :: ফু () লকটি অর্জন করে। এটি তখন বি :: বার () কল করে। এটি আপনি যখন এটি লিখেছিলেন তা ভাল কাজ করেছে। তবে কিছু সময়ের পরে কেউ বি :: বার () এ :: বাজ () কল করতে পরিবর্তন করে, এটি লকটিও অর্জন করে।

ঠিক আছে, আপনার যদি পুনরাবৃত্ত মেটেক্সগুলি না থাকে তবে এই অচল। আপনার যদি এটি থাকে তবে এটি চালায় তবে এটি ভেঙে যেতে পারে। এ :: foo () বার () কল করার আগে বস্তুটিকে একটি বেমানান অবস্থায় ফেলে রেখেছিল, এই ধারণায় যে বাজ () চালাতে পারে না কারণ এটি মুটেক্সও অর্জন করে। তবে এটি সম্ভবত চালানো উচিত নয়! যে ব্যক্তি এ :: ফু () লিখেছেন তিনি ধরে নিয়েছিলেন যে একই সময়ে কেউ এ :: বাজ () কে কল করতে পারে না - এটাই পুরো কারণ যে এই দুটি পদ্ধতিই লকটি অর্জন করেছিল।

মুটেক্সেস ব্যবহারের জন্য সঠিক মানসিক মডেল: মিউটেক্স একটি আক্রমণকারীকে রক্ষা করে। যখন মিউটেক্স রাখা হয়, আক্রমণকারী পরিবর্তন হতে পারে তবে মিউটেক্সকে মুক্তি দেওয়ার আগে আক্রমণকারীটি পুনরায় প্রতিষ্ঠিত হয়। প্রেরণকারী লকগুলি বিপজ্জনক কারণ দ্বিতীয়বার আপনি লকটি অর্জন করলে আপনি নিশ্চিত হতে পারবেন না যে আক্রমণকারী আর কোনও সত্য true

আপনি যদি ভাড়াটে তালা দিয়ে খুশি হন তবে এটি কেবল কারণ আপনার আগে আর কোনও সমস্যা ডিবাগ করতে হয়নি। জাভা এর আজকাল java.util.concurrent.locks এ অ-প্রেরণকারী লক রয়েছে।


4
আপনি যখন দ্বিতীয়বার লকটি ধরেন তখন আক্রমণকারীটির বৈধতা না পাওয়ার বিষয়ে আপনি যা বলছিলেন তা পেতে আমাকে কিছুটা সময় লেগেছে। ভাল যুক্তি! যদি এটি একটি পঠন-লেখার লক (জাভার রিডরাইটলকের মতো) ছিল এবং আপনি পঠিত লকটি অর্জন করেছেন এবং তারপরে একই থ্রেডে দ্বিতীয়বার পঠিত লকটি পুনরায় অধিগ্রহণ করেছেন। আপনি সঠিকভাবে একটি পড়ার লক অর্জনের পরে কোনও আক্রমণকারীকে অবৈধ করবেন না? সুতরাং যখন আপনি দ্বিতীয় পঠিত লকটি অর্জন করবেন তখন আক্রমণকারীটি এখনও সত্য।
dgrant

1
@ জোনাথন কি আজকাল জাভা.ইটি.ল.কমারেন্ট.লকে জাভা-তত্সহীন লক আছে ??
ব্যবহারকারী 45432222

1
+1 আমি অনুমান করি যে, রিরেন্ট্যান্ট লকের জন্য সর্বাধিক সাধারণ ব্যবহার হ'ল একক শ্রেণীর ভিতরে, যেখানে রক্ষিত এবং অ-রক্ষিত উভয় কোড টুকরো থেকে কিছু পদ্ধতি কল করা যেতে পারে। এটি আসলে সর্বদা ফ্যাক্টর আউট করা যায়। @ ব্যবহারকারী 454322 অবশ্যই Semaphore,।
মার্টিনাস

1
আমার ভুল বোঝাবুঝি ক্ষমা করুন, কিন্তু এটি কীভাবে মিটেক্সের সাথে প্রাসঙ্গিক তা আমি দেখছি না। মনে করুন যে কোনও মাল্টিথ্রেডিং এবং লক জড়িত নেই, A::foo()কল করার আগে এখনও অবজেক্টটিকে একটি বেমানান অবস্থায় রেখে গেছে A::bar()। এই মামলার সাথে মুটেক্স, পুনরাবৃত্ত হওয়া বা না করার কিছু আছে কি?
সিয়ুয়ান রেন

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

92

যেমনটি লিখেছেন ডেভ বুটেনহফ নিজে :

"রিকার্সিভ মিটেক্সেসের সাথে সমস্ত বড় সমস্যার মধ্যে সবচেয়ে বড়টি হ'ল তারা আপনাকে আপনার লকিংয়ের স্কিম এবং সুযোগগুলি পুরোপুরি হারিয়ে ফেলতে উত্সাহিত করে This এটি মারাত্মক is মন্দ It's পিরিয়ড। সর্বদা। আপনি যদি কোনও লক দিয়ে কোনও কিছু কল করে থাকেন কেবল এটি কারণ এটি আপনি জানেন না, বা কারণ জানেন না যে কলিটিকে মিটেক্সের প্রয়োজন আছে তবে আপনি এটি খুব দীর্ঘ ধরে রেখেছেন You're আপনার অ্যাপ্লিকেশনটিতে শটগান লক্ষ্য করে ট্রিগারটি টানছেন pres সম্ভবত আপনি একত্রিত হয়ে থ্রেডগুলি ব্যবহার করতে শুরু করেছেন; তবে আপনি কেবল সামঞ্জস্য রেখেছেন ""


9
বুটেনহফের প্রতিক্রিয়াটির চূড়ান্ত অংশটিও নোট করুন: ...you're not DONE until they're [recursive mutex] all gone.. Or sit back and let someone else do the design.
ব্যবহারকারী 45432222

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

13

মুটেক্সেস ব্যবহারের জন্য সঠিক মানসিক মডেল: মিউটেক্স একটি আক্রমণকারীকে রক্ষা করে।

আপনি কেন নিশ্চিত যে মুটেক্সেস ব্যবহারের জন্য এটি সত্যই সঠিক মানসিক মডেল? আমি মনে করি সঠিক মডেল ডেটা রক্ষা করছে তবে আক্রমণকারী নয়।

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

তদ্ব্যতীত, যদি আপনাকে আক্রমণকারীদের রক্ষা করতে হয় তবে আপনি বাইনারি সেমফোর উইচ ব্যবহার করতে পারেন যা কখনও পুনরুক্ত হয় না।


সত্য। আক্রমণকারীকে রক্ষার জন্য আরও ভাল ব্যবস্থা রয়েছে।
অ্যাক্টিভট্রেপ্রেন্টার ট্যাগড্যাটাএসটিআরভিআর

8
এটি যে বিবৃতি দিয়েছিল সেই উত্তরের মন্তব্য হওয়া উচিত। নিঃশব্দগুলি কেবল ডেটা রক্ষা করে না, আক্রমণকারীদেরও সুরক্ষা দেয়। পারমাণবিক (যেখানে ডেটা নিজেকে সুরক্ষিত করে) এর পরিবর্তে কিছু সাধারণ ধারক (সবচেয়ে সহজ স্ট্যাক হওয়া) লেখার চেষ্টা করুন এবং আপনি বিবৃতিটি বুঝতে পারবেন।
ডেভিড রদ্রিগেজ - ফ্রিবি

নীরবতা ডেটা রক্ষা করে না, তারা একটি আক্রমণকারীকে সুরক্ষা দেয়। যদিও সেই আক্রমণকারী ডেটা সুরক্ষার জন্য ব্যবহৃত হতে পারে।
জন হান্না

4

পুনরাবৃত্তিকারী মিউটেক্সগুলি কার্যকর হওয়ার একটি প্রধান কারণ হ'ল একই থ্রেড দ্বারা একাধিকবার পদ্ধতিগুলি অ্যাক্সেস করার ক্ষেত্রে। উদাহরণস্বরূপ, বলুন যে যদি মুটেক্স লকটি প্রত্যাহার করার জন্য কোনও ব্যাংক এ / সি সুরক্ষিত করে থাকে, তবে যদি সেই প্রত্যাহারের সাথে যদি কোনও ফিও যুক্ত হয়, তবে একই মুটেক্স ব্যবহার করতে হবে।


3

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

যদি পদ্ধতিগুলি অন্যান্য পদ্ধতি ব্যবহার করে (যেমন: addNewArray () addNewPoint () কে কল করে এবং recheckBouts ()) দিয়ে চূড়ান্ত করে, তবে সেগুলি দ্বারা যে কোনও একটি নিজেই মিউটেক্সকে লক করতে হবে, তারপরে পুনরাবৃত্তিকারী মুটেক্সটি একটি উইন-উইন।

অন্য যে কোনও ক্ষেত্রে (কেবলমাত্র খারাপ কোডিং সমাধান করা, এমনকি এটি বিভিন্ন বস্তুতে ব্যবহার করা) স্পষ্টতই ভুল!


1

নন-রিকার্সিভ মিউটেক্সগুলি কীসের জন্য ভাল?

এগুলি একেবারে ভাল হয় যখন আপনি কিছু করার আগে মুটেক্স আনলক করা হয়েছে তা নিশ্চিত করতে হবে। এর কারণটি pthread_mutex_unlockগ্যারান্টি দিতে পারে যে নিঃশব্দটি কেবল তখনই মুটেক্স আনলক করা থাকে।

pthread_mutex_t      g_mutex;

void foo()
{
    pthread_mutex_lock(&g_mutex);
    // Do something.
    pthread_mutex_unlock(&g_mutex);

    bar();
}

যদি g_mutexঅ রিকার্সিভ হয়, উপরের কোড কলে নিশ্চিত করা হয় bar()mutex সঙ্গে আনলক

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

যদি g_mutexপুনরাবৃত্তি হয়, কল করার আগে এটি আনলক করা হয়েছে কিনা তা নিশ্চিত করার কোনও উপায় নেই

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