সি # তে পুনরায় প্রবেশকারী লকগুলি


119

নীট কোডটি। নেট উপর সি # ব্যবহার করে অচলাবস্থার ফলাফল করবে?

 class MyClass
 {
    private object lockObj = new object();

    public void Foo()
    {
        lock(lockObj)
        { 
             Bar();
        }
    }

    public void Bar()
    {
        lock(lockObj)
        { 
          // Do something 
        }
    }       
 }

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

12
প্রকৃতপক্ষে আমি এটি অনুসন্ধান শব্দ 'প্রেরণকারী' এর ভিত্তিতে পেয়েছি এবং এটি আমার প্রশ্নের উত্তর দিয়েছে। যদি এটি ডুপ প্রশ্ন, তবে এটি অন্যরকম সমস্যা ...
ইমফিউরি

আমি @ জেফসটার্নাল মন্তব্যের সাথে একমত এই প্রশ্নটি ধরে নিচ্ছে যে প্রশ্নটি অনুসন্ধান করা ব্যক্তি ইতিমধ্যে "পুনরায় প্রবেশকারী" লকগুলির সাথে পরিচিত। আমি মনে করি আরেকটি সদৃশ প্রশ্ন এর জন্য একটি ভাল শিরোনাম ছিল: স্ট্যাকওভারফ্লো
লুইস পেরেজ

উত্তর:


148

না, যতক্ষণ না আপনি একই জিনিসটিতে লক করছেন। পুনরাবৃত্তির কোডটিতে কার্যকরভাবে ইতিমধ্যে লক রয়েছে এবং তাই নির্বিঘ্নে চালিয়ে যেতে পারে।

lock(object) {...}মনিটরের ক্লাস ব্যবহারের জন্য সংক্ষিপ্তকরণ । মার্ক যেমন উল্লেখ করেছে , পুনরায় প্রবেশেরMonitor অনুমতি দেয় , সুতরাং বর্তমান থ্রেডটিতে ইতিমধ্যে একটি লক রয়েছে এমন কোনও জিনিসটিতে লক করার পুনরাবৃত্তি প্রচেষ্টা ঠিক কাজ করবে।

আপনি যদি বিভিন্ন অবজেক্টে লক করা শুরু করেন , তখনই আপনাকে সতর্কতা অবলম্বন করতে হবে। বিশেষ মনোযোগ দিন:

  • সর্বদা একই ক্রমে প্রদত্ত সংখ্যক বস্তুর উপর লকগুলি অর্জন করুন।
  • আপনি কীভাবে এটি অর্জন করেন তার বিপরীত ক্রমে সর্বদা লকগুলি ছেড়ে দিন ।

আপনি যদি এই নিয়মগুলির কোনও একটি ভঙ্গ করেন তবে আপনি কোনও সময়ে ডেডলক সমস্যাগুলি পাওয়ার পক্ষে যথেষ্ট গ্যারান্টিযুক্ত ।

.NET: //dotnetdebug.net/2005/07/20/monitor-class-avoider-deadlocks/ এ থ্রেড সিঙ্ক্রোনাইজেশন বর্ণনা করার জন্য একটি ভাল ওয়েবপৃষ্ঠা এখানে রয়েছে

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

(আরও একটি নোট, আপনার উদাহরণটি প্রযুক্তিগতভাবে পুনরাবৃত্ত নয় it এটি পুনরাবৃত্ত হওয়ার Bar()জন্য, সাধারণত নিজেকে পুনরাবৃত্তির অংশ হিসাবে কল করতে হবে))


1
বিশেষত বিভিন্ন সিকোয়েন্সে।
মার্ক গ্র্যাভেল

6
পুনরাবৃত্তি; প্রকৃতপক্ষে; গাইয়ের সুবিধার জন্য, শব্দটি আবার প্রবেশ করা হয়েছে
মার্ক গ্র্যাভেল

পরিভাষা সম্পর্কে স্পষ্টতার জন্য ধন্যবাদ - আমি প্রশ্নটি সম্পাদনা করেছি এবং সংশোধন করেছি।
গাই

এই প্রশ্নটি বেশ খানিকটা মনোযোগ পেয়েছে বলে মনে হচ্ছে তাই আমি আমার উত্তরটি আপডেট করেছি যেহেতু আমি প্রথম প্রথম এটি লেখার পর থেকে নিয়ে এসেছি wrote
নীল বার্নওয়েল

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

20

ঠিক আছে, Monitorপুনরায় প্রবেশের অনুমতি দেয়, সুতরাং আপনি নিজেকে অচল করতে পারবেন না ... তাই না: এটি করা উচিত নয়


7

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

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


নোট করুন যে মনিটরের ক্ষেত্রে এটি সত্য, তবে অন্য ধরণের লক অগত্যা নয়।
জন স্কিটি

(বোঝাতে ইচ্ছুক নয় যে আপনি এটি জানেন না, অবশ্যই - এটি কেবল একটি গুরুত্বপূর্ণ পার্থক্য :)
জন স্কিটি

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

5

না, এই কোডটিতে মৃত লক থাকবে না। আপনি যদি সত্যিই সবচেয়ে সহজ ডেডলক তৈরি করতে চান তবে কমপক্ষে 2 টি সংস্থান প্রয়োজন। কুকুর এবং হাড়ের পরিস্থিতি বিবেচনা করুন। ১. একটি কুকুরের 1 টি হাড়ের উপরে সম্পূর্ণ নিয়ন্ত্রণ থাকে তাই অন্য যে কোনও কুকুরকে অপেক্ষা করতে হয়। ২. দুটি হাড়যুক্ত কুকুর যথাক্রমে তাদের হাড় লক করে অন্যদেরও হাড়ের সন্ধান করার সময় একটি অচলাবস্থা তৈরি করতে সর্বনিম্ন প্রয়োজন।

.. তাই আরও অনেকগুলি কুকুর এবং মি হাড় এবং আরও পরিশীলিত অচলাবস্থা সৃষ্টি করে।

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