অপরিবর্তনীয়তা মাল্টি-প্রসেসর প্রোগ্রামিংয়ে লকগুলির প্রয়োজনীয়তা কি পুরোপুরি দূর করে?


39

অংশ 1

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

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

যদি অপরিবর্তনযোগ্যতা নিরাপদ থাকে তবে নির্দিষ্ট সীমা বা অনুমান দেওয়া থাকলে আমি জানতে চাই "সুরক্ষা অঞ্চল" এর সীমানা ঠিক কী exactly সম্ভাব্য সীমানার কয়েকটি উদাহরণ:

  • ইনপুট / আউটপুট
  • ব্যতিক্রমসমূহ / ত্রুটি
  • অন্যান্য ভাষায় লিখিত প্রোগ্রামগুলির সাথে ইন্টারঅ্যাকশন
  • অন্যান্য মেশিনের সাথে মিথস্ক্রিয়া (শারীরিক, ভার্চুয়াল বা তাত্ত্বিক)

এই প্রশ্নটি শুরু হয়েছে এমন মন্তব্যের জন্য @ জিম্মাহফফাকে বিশেষ ধন্যবাদ !

অংশ ২

মাল্টি-প্রসেসর প্রোগ্রামিং প্রায়শই একটি অপ্টিমাইজেশন কৌশল হিসাবে ব্যবহৃত হয় - কিছু কোড দ্রুত চালানোর জন্য। লক বনাম অপরিবর্তনীয় বস্তু ব্যবহার করা কখন দ্রুত হয়?

আমদাহলের আইনে নির্ধারিত সীমাবদ্ধতার পরিপ্রেক্ষিতে আপনি কখন অপরিবর্তনীয় বস্তু বনাম লক পরিবর্তনযোগ্যগুলির সাথে সর্বোত্তম কর্মক্ষমতা অর্জন করতে পারবেন (আবর্জনা সংগ্রহকারীকে বিবেচনায় নেওয়া বা না নিয়ে)?

সারাংশ

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


21
but everything has a side effect- আহ, না এটা হয় না। এমন একটি ফাংশন যা কিছু মান গ্রহণ করে এবং অন্য কিছু মান ফেরত দেয়, এবং ফাংশনের বাইরের কোনও কিছুকে বিরক্ত করে না, এর কোনও পার্শ্ব প্রতিক্রিয়া নেই এবং তাই থ্রেড-নিরাপদ। কম্পিউটার বিদ্যুৎ ব্যবহার করে তাতে কিছু যায় আসে না। আমরা চাইলে মেমোরি কোষগুলিকে আঘাত করা মহাজাগতিক রশ্মি সম্পর্কেও কথা বলতে পারি, তবে যুক্তিটিকে ব্যবহারিক করে তোলা যাক। আপনি যদি ফাংশনটি সঞ্চালনের উপায়টি কীভাবে বিদ্যুৎ খরচকে প্রভাবিত করে সে মতো বিষয়গুলি বিবেচনা করতে চান, এটি থ্রেডসেফ প্রোগ্রামিংয়ের চেয়ে আলাদা সমস্যা।
রবার্ট হার্ভে

5
@ রবার্টহারভে - সম্ভবত আমি পার্শ্ব-প্রতিক্রিয়া সম্পর্কিত একটি পৃথক সংজ্ঞা ব্যবহার করছি এবং এর পরিবর্তে আমার উচিত ছিল "রিয়েল-ওয়ার্ল্ড পার্শ্ব-প্রতিক্রিয়া"। হ্যাঁ, গণিতবিদদের পার্শ্ব-প্রতিক্রিয়া ছাড়াই ফাংশন রয়েছে। কোড যা একটি বাস্তব-জগতের মেশিনে চালিত করে তা কার্যকর করতে মেশিনের সংস্থান গ্রহণ করে, তা ডেটা পরিবর্তন করে কিনা। আপনার উদাহরণের ফাংশনটি বেশিরভাগ মেশিন আর্কিটেকচারে স্ট্যাকের উপর তার রিটার্ন মান রাখে।
গ্লেনপিটারসন

1
আপনি আসলে এটা মাধ্যমে পেতে পারেন, আমি তোমার প্রশ্ন এই কুখ্যাত কাগজ হৃদয় যায় মনে research.microsoft.com/en-us/um/people/simonpj/papers/...
জিমি Hoffa

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

1
পুনঃটুইট Monades heh এবং আপনি এটি প্রথম দু'টি পৃষ্ঠা থেকে সংগ্রহ করতে পারেন। আমি এটি উল্লেখ করেছি কারণ পুরোটি জুড়েই এটি ব্যবহারিকভাবে খাঁটি উপায়ে পার্শ্ব প্রতিক্রিয়াগুলি পরিচালনা করার জন্য একটি কৌশল সম্পর্কে বিস্তারিত জানায়, আমি দৃ sure়ভাবে নিশ্চিত যে এটি গ্লেনের প্রশ্নের উত্তর দেবে, সুতরাং যে কেউ এই প্রশ্নটি খুঁজে পায় তাকে একটি ভাল পায়ের নোট হিসাবে পোস্ট করেছেন ভবিষ্যতে আরও পড়ার জন্য।
জিমি হোফা

উত্তর:


35

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

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

এখন, এটি আপনি কি পায়? অপরিবর্তনীয়তা আপনাকে একটি জিনিস দেয়: আপনি স্থিতিস্থাপকীয় জিনিসটি আপনার নীচে পরিবর্তিত অবস্থার বিষয়ে চিন্তাভাবনা না করে অবাধে পড়তে পারেন (ধরে নিই এটি সত্যই গভীরভাবে পরিবর্তনযোগ্য ... পরিবর্তনীয় সদস্যদের সাথে একটি অপরিবর্তনীয় বস্তু থাকা সাধারণত একটি চুক্তি বিয়োগকারী হয়)। এটাই. এটি আপনাকে একত্রে পরিচালনা (লক, স্ন্যাপশট, ডেটা বিভাজন বা অন্যান্য প্রক্রিয়াগুলির মাধ্যমে পরিচালনা থেকে মুক্তি দেয়; লকগুলিতে মূল প্রশ্নের মূল দৃষ্টি নিবদ্ধ করা ... প্রশ্নের ক্ষেত্রের ভিত্তিতে ভুল)।

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

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

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

সুতরাং সংক্ষিপ্তসার হিসাবে: অপরিবর্তনীয়তা সাহায্য করে তবে সম্মতিটি সঠিকভাবে পরিচালনা করার জন্য প্রয়োজনীয় চ্যালেঞ্জগুলি দূর করবে না। এই সহায়তা বিস্তৃত হতে থাকে, তবে সবচেয়ে বেশি লাভ কর্মক্ষমতা না করে মানের দিক থেকে হয় a এবং না, অপরিবর্তনীয়তা আপনাকে যাদুতে আপনার অ্যাপ্লিকেশনটিতে সমঝোতা পরিচালনা থেকে ক্ষমা করবেন না, দুঃখিত।


+1 এটি উপলব্ধি করে তবে কী আপনি এখনও উদাহরণস্বরূপ বলতে পারেন যেখানে গভীর অবিচ্ছিন্ন ভাষায় আপনাকে এখনও সমঝোতা সঠিকভাবে পরিচালনা করার বিষয়ে চিন্তা করতে হবে? আপনি বলেছেন যে আপনি করেন তবে এ জাতীয় দৃশ্য আমার কাছে পরিষ্কার নয়
জিমি হোফা

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

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

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

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

13

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

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

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

ধরা যাক আমি একটি সাধারণ ফাংশন চাই যা একটি স্ট্রিং সংগ্রহ গ্রহণ করে এবং একটি স্ট্রিং দেয় যা কমা দ্বারা পৃথকীকরণে সংগ্রহের সমস্ত স্ট্রিংয়ের সংমিশ্রণ। সি # তে একটি সরল, নির্বাক বাস্তবায়ন এর মতো দেখতে পাওয়া যেতে পারে:

public string ConcatenateWithCommas(ImmutableList<string> list)
{
    string result = string.Empty;
    bool isFirst = false;

    foreach (string s in list)
    {
        if (isFirst)
            result += s;
        else
            result += ", " + s;
    }
    return result;
} 

এই উদাহরণটি অপরিবর্তনীয়, প্রথম দিকের। আমি কীভাবে জানি? কারণ stringবস্তু অপরিবর্তনীয়। তবে বাস্তবায়ন আদর্শ নয়। resultঅপরিবর্তনীয় কারণ , প্রতিবার লুপের মাধ্যমে একটি নতুন স্ট্রিং অবজেক্ট তৈরি করতে হবে, যা মূল বিষয়টিকে নির্দেশ করে resultpoints এটি গতিতে নেতিবাচকভাবে প্রভাব ফেলতে পারে এবং আবর্জনা সংগ্রহকারীকে চাপ দিতে পারে, যেহেতু এটি অতিরিক্ত সমস্ত স্ট্রিং পরিষ্কার করতে হয়।

এখন, আমি বলি যে আমি এটি করছি:

public string ConcatenateWithCommas(ImmutableList<string> list)
{
    var result = new StringBuilder();
    bool isFirst = false;

    foreach (string s in list)
    {
        if (isFirst)
            result.Append(s);
        else
            result.Append(", " + s);
    }
    return result.ToString();
} 

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

স্ট্রিংবিল্ডার পরিবর্তনযোগ্য হলেও এই ফাংশনটি কি অপরিবর্তনীয়?

হ্যাঁ, তাই কেন? প্রতিবার এই ফাংশনটি ডাকা হওয়ার কারণে , কেবলমাত্র সেই কলটির জন্যই একটি নতুন স্ট্রিংবিল্ডার তৈরি করা হয়। সুতরাং এখন আমাদের কাছে একটি খাঁটি ফাংশন রয়েছে যা থ্রেড-নিরাপদ তবে এতে পরিবর্তনীয় উপাদান রয়েছে।

তবে আমি যদি এটা করতাম?

public class Concatenate
{
    private StringBuilder result = new StringBuilder();
    bool isFirst = false;

    public string ConcatenateWithCommas(ImmutableList<string> list)
    {
        foreach (string s in list)
        {
            if (isFirst)
                result.Append(s);
            else
                result.Append(", " + s);
        }
        return result.ToString();
    } 
}

এই পদ্ধতিটি কি থ্রেড-নিরাপদ? না, তা নয়। কেন? কারণ ক্লাসটি এখন এমন অবস্থা ধরে রেখেছে যেটির উপর আমার পদ্ধতি নির্ভর করে। একটি দৌড় শর্ত এখন পদ্ধতিতে উপস্থিত রয়েছে: একটি থ্রেড সংশোধন করতে পারে IsFirstতবে অন্য থ্রেডটি প্রথম সঞ্চালন করতে পারে Append(), সেক্ষেত্রে আমার স্ট্রিংয়ের শুরুতে এখন আমার কমা রয়েছে যা সেখানে থাকার কথা নয়।

আমি কেন এটি এটি করতে চাই? ঠিক আছে, আমি চাইব যে থ্রেডগুলি resultঅর্ডারকে বিবেচনা না করেই আমার মধ্যে স্ট্রিংগুলি জমা করতে পারে বা থ্রেডগুলি যে ক্রমে আসে Maybe সম্ভবত এটি কোনও লগার, কে জানে?

যাইহোক, এটি ঠিক করার জন্য, আমি lockপদ্ধতির অভ্যন্তরের চারপাশে একটি বিবৃতি রেখেছি ।

public class Concatenate
{
    private StringBuilder result = new StringBuilder();
    bool isFirst = false;
    private static object locker = new object();

    public string AppendWithCommas(ImmutableList<string> list)
    {
        lock (locker)
        {
            foreach (string s in list)
            {
                if (isFirst)
                    result.Append(s);
                else
                    result.Append(", " + s);
            }
            return result.ToString();
        }
    } 
}

এখন এটি আবার থ্রেড-নিরাপদ।

আমার অপরিবর্তনীয় পদ্ধতিগুলি থ্রেড-নিরাপদ হতে ব্যর্থ হওয়ার একমাত্র উপায় হ'ল পদ্ধতিটি যদি কোনওভাবে তার বাস্তবায়নের অংশ ফাঁস করে। এটা কি ঘটতে পারে? সংকলকটি সঠিক এবং প্রোগ্রামটি সঠিক হলে নয়। আমি কি কখনও এই জাতীয় পদ্ধতিতে লক প্রয়োজন? না।

কীভাবে বাস্তবায়নের সম্ভাব্য পরিস্থিতিতে দৃশ্যে ফাঁস হতে পারে তার উদাহরণের জন্য, এখানে দেখুন


2
আমি ভুল না করে, কারণ একটি Listপরিবর্তনীয়, প্রথম ফাংশনে আপনি 'খাঁটি' দাবি করেছিলেন, অন্য থ্রেড তালিকা থেকে সমস্ত উপাদানগুলি সরিয়ে ফেলতে পারে বা ফোরচ লুপে থাকা অবস্থায় আরও একটি গুচ্ছ যুক্ত করতে পারে। এটি কীভাবে এড IEnumeratorহওয়ার সাথে খেলবে তা নিশ্চিত নয় while(iter.MoveNext()), তবে যদি না স্থির IEnumerator(সন্দেহজনক) না হয় তবে এটি পূর্বাঞ্চের লুপটি ছিন্ন করার হুমকি দেয়।
জিমি হোফা

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

আমি মনে করি না যে আপনি এটিটিকে 'খাঁটি' বলতে পারবেন যখন এটির মধ্যে এমন পরিবর্তনীয় অবজেক্ট রয়েছে যা এটি রেফারেন্সের মাধ্যমে ব্যবহার করছে। যদি একটি IEnumerable পেয়েছি আপনি পারে একটি তালিকা IEnumerable হিসাবে হস্তান্তর তাই IEnumerable চুক্তি কোন ফর্ম নিশ্চয়তা দেয় না তেমন দাবি তুলতে কারণ আপনার যোগ করতে অথবা একটি IEnumerable থেকে উপাদানগুলি সরাতে পারবেন না পাবে, কিন্তু তারপর এটা একটি অ্যারের হতে পারে বা পবিত্রতা। সেই ফাংশনটিকে বিশুদ্ধ করার আসল কৌশলটি পাস-কপি-অনুলিপি দ্বারা অপরিবর্তনযোগ্যতা হবে, সি # এটি করে না যাতে ফাংশনটি এটি পাওয়ার পরে তালিকার ঠিক কপি করতে হবে; তবে এটি করার একমাত্র উপায় এটিতে ভবিষ্যদ্বাণী করা ...
জিমি হোফা

1
@ জিমি হোফা: দাম্মি, আপনি আমাকে এই মুরগি এবং ডিমের সমস্যায় ডুবে গেছেন! আপনি যদি কোথাও কোনও সমাধান দেখতে পান তবে দয়া করে আমাকে জানান।
রবার্ট হার্ভে

1
এই মুহুর্তে এখনই এই উত্তরটি এসেছে এবং আমি যে বিষয়টি নিয়ে এসেছি তার সেরা ব্যাখ্যাগুলির মধ্যে একটি, উদাহরণগুলি অত্যন্ত সংক্ষিপ্ত এবং সত্যিকার অর্থে এটি আঁকানো সহজ করে তোলে। ধন্যবাদ!
স্টিফেন বাইর্ন

4

আমি আপনার প্রশ্নগুলি বুঝতে পারলে নিশ্চিত নই।

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

অংশ 2 - এর উত্তরগুলির জন্য লকগুলি সর্বদা কোনও লকের চেয়ে ধীর হওয়া উচিত।


3
দ্বিতীয় ভাগ জিজ্ঞাসা করছে "তালা এবং অপরিবর্তনীয় কাঠামোর মধ্যে পারফরম্যান্স ট্রেড অফ কী?" এটি সম্ভবত তার নিজস্ব প্রশ্নের প্রাপ্য, যদি এটি এমনকি জবাবদিহি করে।
রবার্ট হার্ভে

4

কোনও পরিবর্তনযোগ্য অবজেক্টের একক পরিবর্তনীয় রেফারেন্সে গুচ্ছ সম্পর্কিত রাজ্যের গুচ্ছকে আবদ্ধ করা প্যাটার্নটি ব্যবহার করে অনেক ধরণের রাষ্ট্রীয় পরিবর্তনকে লক-ফ্রি করা সম্ভব করে তোলে:

do
{
   oldState = someObject.State;
   newState = oldState.WithSomeChanges();
} while (Interlocked.CompareExchange(ref someObject.State, newState, oldState) != oldState;

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

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


4

আপনি দিয়ে শুরু

স্পষ্টত অপরিচ্ছন্নতা মাল্টি-প্রসেসর প্রোগ্রামিংয়ের তালার প্রয়োজনীয়তা হ্রাস করে

ভুল। আপনার ব্যবহৃত প্রতিটি শ্রেণীর জন্য আপনাকে অবশ্যই ডকুমেন্টেশন পড়তে হবে। উদাহরণস্বরূপ, const std :: সি স্ট্রিং ++, হয় না নিরাপদ থ্রেড। অপরিবর্তনীয় বস্তুর অভ্যন্তরীণ অবস্থা থাকতে পারে যা অ্যাক্সেস করার সময় পরিবর্তিত হয়।

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

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


2
const std::stringএটি একটি দুর্বল উদাহরণ এবং একটি লাল হেরিংয়ের একটি। সি ++ স্ট্রিংগুলি পরিবর্তনযোগ্য, এবং constযাইহোক অপরিবর্তনীয়তার গ্যারান্টি দিতে পারে না। এটি কেবল যা বলছে কেবলমাত্র constফাংশন বলা যেতে পারে। তবে, এই ফাংশনগুলি এখনও অভ্যন্তরীণ অবস্থার পরিবর্তন constকরতে পারে এবং এটিকে ফেলে দেওয়া যেতে পারে। শেষ অবধি, অন্য যে কোনও ভাষার মতো একই সমস্যা রয়েছে: আমার রেফারেন্সটি কেবল আপনার রেফারেন্সের constঅর্থ এই নয় । না, একটি সত্যিকারের অপরিবর্তনীয় ডেটা কাঠামো ব্যবহার করা উচিত।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.