লক (নতুন অবজেক্ট ()) - কার্গো কাল্ট বা কিছু ক্রেজি "ভাষার বিশেষ কেস"?


87

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

private void foo()
{
    if (InvokeRequired)
    {
        lock (new object())
        {
            if (m_bar!= null)
                Invoke(new fooDelegate(foo), new object[] { });
        }
    }
    else
    {
        if(OnBazChanged != null)
            OnBazChanged();
    }
}

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


19
আমি মনে করি তারা খুব বিভ্রান্ত তারা সম্ভবত এটি দেখেছিল যেখানে new object()কোনও ক্ষেত্রটি সংরক্ষণ করা হয়েছিল, এবং সেই ক্ষেত্রটি lock()বিবৃতিতে ব্যবহৃত হয়েছিল এবং তারা এটিকে ইনলাইন না করা ভাল জানত না।
ড্যামিয়েন_এ_বিশ্বাসীরা

21
এই "পরামর্শদাতা" এর কিছু ব্যাখ্যা করার আছে ... আপনি ভুল নন: সেই lockকোডটি পুরোপুরি অকেজো
মার্ক গ্র্যাভেল

12
@ বাবুন: কেবলমাত্র যদি আপনি রিফ্যাক্টরিংটি করতে না হয় তবে ...

4
এছাড়াও, এটি যদি উইনফোর্ডস হয় তবে আমি কেন সেখানে লক থাকা উচিত তা দেখতে পাচ্ছি না।
ড্র নোকস

7
এটি সরান, তারপরে আপনার 100% কোড-কভারেজ পরীক্ষার স্যুটটি আবার চালান। ওটা কী? আগের পরামর্শদাতা একটি করেনি?
স্পেসডম্যান

উত্তর:


82

কেউ যদি এটি দেখেছে তবে আমি অবাক হব না:

private readonly object lockObj = new object();

private void MyMethod()
{
    lock(lockObj)
    {
        // do amazing stuff, so amazing it can only run once at a time
        // e.g. comands on the Mars Rover, or programs on iOS pre 4 / 5 ??
    }
}

এবং ভেবেছিল সে লাইন সংখ্যা কেটে দিতে পারে।

যদিও এমনটি যদি হত তবে আমি খুব চিন্তিত হব ...


4
তিনি "নিউঅবজেক্ট ()" নামে একটি পদ্ধতি দেখতে পেয়েছিলেন এবং এই পদ্ধতিতে কোনও একক উদাহরণ ফিরে এসেছে, কিন্তু তিনি বলেছিলেন "আরে, সি # এর কীওয়ার্ড নেই"?
অমিরাম কোরাচ

9
এটি কী চলছে তা কার্যকরভাবে না বুঝে রিফ্যাক্টরিং কাজের মতো শোনাচ্ছে।
এফিলিয়ন

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

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

4
স্পষ্টত ভাঙা লকিংয়ের বিষয়ে আমি খুব একটা পাত্তা দিই না - অন্য প্রত্যেকে ইতিমধ্যে এটি চিহ্নিত করেছে, তবে iOS এর 4/5 'বা প্রোগ্রামের জন্য কেবল +1 <g>
মার্টিন জেমস

15

এখানে অনুরূপ প্রশ্ন এবং উত্তর:

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


2

এটি সম্ভবত অকেজো। তবে সেখানে মেমোরি বাধা তৈরি করার অফ অফ সুযোগ রয়েছে। নিশ্চিত না যে সি # লক এলিজেন করে কিনা বা এটি লকের ক্রমবর্ধমান শব্দার্থ সংরক্ষণ করে কিনা তা করে কিনা Not


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

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