সাধারণভাবে পুনরায় প্রবেশকারী লক এবং ধারণাটি কী?


95

আমি সবসময় বিভ্রান্ত হই কেউ কি বিভিন্ন প্রসঙ্গে রেন্টেন্টের অর্থ বোঝাতে পারে? এবং কেন আপনি পুনরায় বিতরণকারী বনাম নন-রিসেন্ট্যান্ট ব্যবহার করতে চান?

প্রাইড্রেডকে লকিং স্ট্র্যাড (পিক্সিক্স) বলুন, তারা কি আবার প্রবেশ করানো হয় না? কোন সমস্যাগুলি এগুলি ব্যবহার করার সময় এড়ানো উচিত?

মুটেক্স কি আবার প্রবেশকারী?

উত্তর:


161

পুনরায় প্রবেশকারী লক করা

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

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

কোড যদি ভাগ করা রাষ্ট্রের উপর নির্ভর করে যা এর মৃত্যুদন্ডের মাঝামাঝি সময়ে আপডেট করা যেতে পারে তবে এটি পুনরায় প্রবেশকারী নয়, অন্ততপক্ষে যদি আপডেটটি এটি ভেঙে ফেলতে পারে না।

পুনরায় প্রবেশকারী লকিংয়ের জন্য একটি ব্যবহারের কেস

একটি পুনরায় প্রবেশকারী লকের জন্য আবেদনের উদাহরণ (কিছুটা জেনেরিক এবং স্বীকৃত) উদাহরণ হতে পারে:

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

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

  • আপনার গণনা আপনি কী নোডগুলি পরিদর্শন করেছেন সে সম্পর্কে সম্পূর্ণ তথ্য ধরে রাখতে পারে না বা আপনি এমন কোনও ডেটা স্ট্রাকচার ব্যবহার করছেন যা 'আমি আগে এখানে ছিলাম' প্রশ্নের উত্তরগুলি দ্রুত উত্তর দেওয়ার অনুমতি দেয় না।

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

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

পুনরায় প্রবেশকারী মুটেক্সেস

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

আইআইআরসি পোসিএক্স থ্রেড এপিআই পুনরায় প্রবেশকারী এবং পুনরায় প্রবেশকারী নন-মেন্টেক্সগুলির বিকল্প সরবরাহ করে।


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

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

4
গতকাল আমার সাথে যা ঘটেছিল তা হ'ল: আমি পুনরায় প্রবেশের বিষয়টি বিবেচনায় নিই না এবং 5 ঘন্টার জন্য অচলাবস্থাটি শেষ করি ...
যানজমজজ

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

21

একটি পুনরায় প্রবেশকারী লক আপনাকে এমন একটি পদ্ধতি লিখতে দেয় Mযা সংস্থানটিতে একটি লক রাখে Aএবং তারপরে Mপুনরাবৃত্তির সাথে বা ইতিমধ্যে একটি লক ধরে থাকা কোড থেকে কল করে A

একটি পুনরায় প্রবেশকারী লক সহ আপনার 2 সংস্করণ প্রয়োজন M, একটি লক এবং একটি যা না, এবং ডানটিকে কল করার জন্য অতিরিক্ত যুক্তি প্রয়োজন।


এর অর্থ কি যদি আমার একাধিকবার একই লক আপত্তি অর্জনকারী কলগুলি আসে - xপ্রদত্ত থ্রেড দ্বারা বারবার বলে , আমি পুনরাবৃত্তভাবে অর্জিত সমস্ত লকগুলি (একই লকটি ছাড়াও xবহুবার মুক্তি না দিয়ে) ফাঁসি কার্যকর করতে পারি না ? যদি সত্য হয়, তবে তা মূলত এই বাস্তবায়নটিকে অনুক্রমিক করে তোলে। আমি কিছু অনুপস্থিত করছি?
দেবদত্তক

এটি আসল সমস্যা হওয়া উচিত নয়। এটি দানাদার লক করা সম্পর্কে আরও বেশি এবং একটি থ্রেড নিজেই লক হয়ে যায় না।
হেন্ক হলটারম্যান

17

এই টিউটোরিয়ালে প্রেরণকারী লকটি খুব ভালভাবে বর্ণিত ।

টিউটোরিয়ালের উদাহরণটি গ্রাফের ট্র্যাভারিংয়ের উত্তরের তুলনায় অনেক কম স্বীকৃত। একটি সহজলভ্য লক খুব সহজ ক্ষেত্রে কার্যকর।


3

কি এবং কেন পুনরাবৃত্তিমূলক মুখ্যকে গ্রহণযোগ্য উত্তরে বর্ণিত এমন জটিল জিনিস হওয়া উচিত নয়।

জালের আশেপাশে কিছু খনন করার পরে আমি আমার বোঝার কথাটি লিখতে চাই।


প্রথমত, আপনার উপলব্ধি করা উচিত যে মুটেেক্স সম্পর্কে কথা বলার সময় , মাল্টি থ্রেড ধারণাগুলি অবশ্যই জড়িত। (মুটেক্স সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয় my আমার প্রোগ্রামে আমার কেবল 1 টি থ্রেড থাকলে আমার মুটেক্সের প্রয়োজন হবে না)


দ্বিতীয়ত, আপনি একটি সাধারণ মুটেক্স এবং একটি পুনরাবৃত্ত মিউটেক্সের মধ্যে পার্থক্যটি জানতে পারবেন ।

এপিইউ থেকে উদ্ধৃত :

(একটি পুনরাবৃত্তিমূলক মুটেক্স ক) এমন একটি মিউটেক্স টাইপ যা একই থ্রেডটিকে প্রথম আনলক না করে একাধিকবার লক করতে দেয়।

মূল পার্থক্যটি হ'ল একই থ্রেডের মধ্যে , পুনরাবৃত্ত হওয়া লকটি রিলক করা অচলাবস্থার দিকে পরিচালিত করে না, থ্রেডকে অবরুদ্ধ করে না।

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

আসুন প্রমাণ হিসাবে কিছু কোড দেখুন।

  1. অচলাবস্থার সাথে স্বাভাবিক মুটেক্স

আউটপুট:

thread1
thread1 hey hey
thread2

সাধারণ অচলাবস্থা উদাহরণ, কোন সমস্যা নেই।

  1. অচলাবস্থার সাথে পুনরাবৃত্তিমূলক মিটেক্স

শুধু এই লাইনটি uncomment
error = pthread_mutexattr_settype(&lock_attr, PTHREAD_MUTEX_RECURSIVE);
এবং অন্য একটি মন্তব্য।

আউটপুট:

thread1
thread1 hey hey
thread2

হ্যাঁ, রিকার্সিভ মিটেক্সও অচলাবস্থার কারণ হতে পারে।

  1. স্বাভাবিক মুটেক্স, একই থ্রেডে পুনরায় স্থাপন করুন

আউটপুট:

thread1
func3
thread2

ডেডলক ইন thread t1, ইন func3
(আমি sleep(2)এটি দেখতে আরও সহজ করার জন্য ব্যবহার করেছি যে অচলাবস্থার কারণে প্রথমদিকে অচলাবস্থার সৃষ্টি হয়েছিল func3)

  1. পুনরাবৃত্তিমায়িত মুটেক্স, একই থ্রেডে পুনরায় স্থাপন করুন

আবার, পুনরাবৃত্তিমূলক মিটেক্স লাইনটিকে সংলগ্ন করুন এবং অন্য লাইনে মন্তব্য করুন।

আউটপুট:

thread1
func3
func3 hey hey
thread1 hey hey
thread2

ডেডলক ইন thread t2, ইন func2। দেখা? func3সমাপ্ত এবং প্রস্থান করে, রিলকিং থ্রেডকে বাধা দেয় না বা অচলাবস্থার দিকে পরিচালিত করে না।


সুতরাং, শেষ প্রশ্ন, কেন আমাদের এটি প্রয়োজন?

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

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

গৃহীত উত্তর থেকে একটি উদাহরণ দেখুন কখন পুনরাবৃত্তিমূলক মুদ্রা ব্যবহার করবেন?

উইকিপিডিয়া পুনরাবৃত্তিকারী মুটেক্সকে খুব ভালভাবে ব্যাখ্যা করে। একটি পড়ার জন্য অবশ্যই মূল্যবান। উইকিপিডিয়া: প্রেরণকারী_মুটেক্স

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