সি # তে বিভিন্ন থ্রেডিং সিঙ্ক্রোনাইজেশন বিকল্পগুলির মধ্যে পার্থক্যগুলি কী?


164

কেউ পার্থক্য ব্যাখ্যা করতে পারেন:

  • লক (সামোবজেক্ট)}
  • মিটেক্স ব্যবহার করা হচ্ছে
  • সেমাফোর ব্যবহার করা
  • মনিটর ব্যবহার করা
  • অন্যান্য। নেট সিঙ্ক্রোনাইজেশন ক্লাস ব্যবহার করে

আমি ঠিক এটি বুঝতে পারি না। আমার কাছে মনে হচ্ছে প্রথম দুটো কি এক?


এই লিঙ্কটি আমাকে অনেক সহায়তা করেছে: albahari.com/threading
রাফেল

উত্তর:


135

দুর্দান্ত প্রশ্ন। আমি হয়ত ভুল .. আমাকে চেষ্টা করতে দাও .. আমার উত্স উত্তরের 2 # সংশোধন .. আরও কিছুটা বোঝার সাথে। আমাকে পড়ার জন্য ধন্যবাদ :)

লক (obj)

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

মনিটর

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

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

mutex:

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

Semaphores (আমার মস্তিষ্কে আঘাত)

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

পড়ার পৃষ্ঠা - থ্রেড সিঙ্ক্রোনাইজেশন (সি #)


18
আপনি দাবি করেন যে Monitorযোগাযোগটি ভুল হতে দেয় না; আপনি এখনও Pulseএকটি দিয়ে দিয়ে পারেনMonitor
মার্ক গ্র্যাভেল

3
Semaphores এর বিকল্প বর্ণনা দেখুন - stackoverflow.com/a/40473/968003 । একটি নাইটক্লাবের বাউন্সার হিসাবে সেমোফোরগুলি ভাবেন। এমন এক নিবেদিত সংখ্যক লোক রয়েছে যা একবারে ক্লাবে অনুমতিপ্রাপ্ত। ক্লাবটি পূর্ণ থাকলে কাউকে প্রবেশের অনুমতি দেওয়া হয় না, তবে একজন ব্যক্তি চলে যাওয়ার সাথে সাথেই অন্য ব্যক্তি প্রবেশ করতে পারে।
অ্যালেক্স ক্লাউস

31

পুনরায় "অন্যান্য। নেট সিঙ্ক্রোনাইজেশন ক্লাসগুলি ব্যবহার করা হচ্ছে" - অন্যদের মধ্যে আপনার কিছু সম্পর্কে জানা উচিত:

সিসিআর / টিপিএল ( সমান্তরাল এক্সটেনশানস সিটিপি) - এ আরও (লো ওভারহেড) লকিং কনস্ট্রাকশন রয়েছে - তবে আইআইআরসি, এগুলি নেট নেট 4.0.০ এ উপলব্ধ করা হবে


সুতরাং আমি যদি একটি সাধারণ সিগন্যাল যোগাযোগ চাই (একটি অ্যাসিঙ্ক বিকল্পের সমাপ্তি বলুন) - আমার নিরীক্ষণ করা উচিত? প্লাস? অথবা সেমাফোরস্লিম বা টাস্ক কমপ্লেশনসোর্স ব্যবহার করবেন?
বিবেক

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

14

ইসিএমএ-তে বর্ণিত হিসাবে এবং আপনি যেমন প্রতিফলিত পদ্ধতিগুলি থেকে পর্যবেক্ষণ করতে পারেন লক স্টেটমেন্টটি মূলত সমান

object obj = x;
System.Threading.Monitor.Enter(obj);
try {
   
}
finally {
   System.Threading.Monitor.Exit(obj);
}

পূর্বোক্ত উদাহরণ থেকে আমরা দেখতে পাচ্ছি যে মনিটররা বস্তুগুলিতে লক করতে পারে।

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

সেমোফোরগুলি স্টেরয়েডগুলিতে মুটেক্সেসের মতো, তারা একযোগে অ্যাক্সেসের সর্বাধিক গণনা সরবরাহ করে একযোগে অ্যাক্সেসের অনুমতি দেয়। একবার সীমা পৌঁছে গেলে সেমফোরে রিসোর্সে আর কোনও অ্যাক্সেস আটকাতে শুরু করে যতক্ষণ না কলার একজন সেমফোর প্রকাশ না করে।


5
এই সিনট্যাকটিক চিনিটি
পিটার গ্যাফাদার

14

আমি ডটজিএনইউতে থ্রেডিংয়ের জন্য ক্লাস ও সিএলআর সমর্থন করেছি এবং আমার কিছু চিন্তা আছে ...

যদি আপনার ক্রস প্রক্রিয়া লকগুলির প্রয়োজন না থাকে তবে আপনার সর্বদা Mutex এবং Semaphores ব্যবহার এড়ানো উচিত। .NET- এ এই ক্লাসগুলি উইন 32 মুটেক্স এবং সেমোফোরসের চারপাশে মোড়ক এবং বরং ভারী ওজনযুক্ত (তাদের কার্নেলের মধ্যে একটি প্রসঙ্গের স্যুইচ প্রয়োজন যা ব্যয়বহুল - বিশেষত যদি আপনার লকটি বিতর্ক না করে)।

অন্যদের যেমন উল্লেখ করা হয়েছে, সি # লক স্টেটমেন্টটি মনিটর.এন্টার এবং মনিটরের জন্য সংকলক যাদু x এক্সিট (একটি চেষ্টা / শেষ অবধি বিদ্যমান)।

মনিটরের একটি সাধারণ তবে শক্তিশালী সিগন্যাল / অপেক্ষার প্রক্রিয়া রয়েছে যা মন্টেক্সের কাছে মনিটর.পুলস / মনিটর.বিট পদ্ধতিগুলির মাধ্যমে নেই। উইন 32 সমতুল্য হ'ল ক্রিয়েটিভেন্টের মাধ্যমে ইভেন্ট ইভেন্ট হবে যা প্রকৃতপক্ষে ওয়েটহ্যান্ডলস হিসাবে নেটও উপস্থিত রয়েছে। পালস / ওয়েট মডেলটি ইউনিক্সের pthread_signal এবং pthread_wait এর অনুরূপ তবে দ্রুততর কারণ এগুলি অন-বিবাদযুক্ত ক্ষেত্রে সম্পূর্ণরূপে ব্যবহারকারী-মোড অপারেশন হতে পারে।

মনিটর.পুলস / অপেক্ষা করুন ব্যবহার করা সহজ। একটি থ্রেডে, আমরা কোনও বস্তুকে লক করব, একটি পতাকা / রাষ্ট্র / সম্পত্তি যাচাই করুন এবং এটি আমাদের প্রত্যাশা মতো না হলে মনিটরে কল করুন aউইট যা লকটি প্রকাশ করবে এবং একটি নাড়ি পাঠানো পর্যন্ত অপেক্ষা করবে। যখন প্রত্যাবর্তন ফিরে আসে, আমরা ফিরে লুপ করে আবার পতাকা / রাজ্য / সম্পত্তি যাচাই করি। অন্য থ্রেডে, আমরা যখনই পতাকা / রাজ্য / সম্পত্তি পরিবর্তন করি তখন আমরা বস্তুটিকে লক করি এবং তারপরে যেকোন শ্রেনী থ্রেড জাগ্রত করতে পल्सএলকে কল করি।

প্রায়শই আমরা চাই আমাদের ক্লাসগুলি থ্রেড নিরাপদ থাকুক যাতে আমরা আমাদের কোডে লক রাখি। তবে এটি প্রায়শই ঘটে থাকে যে আমাদের ক্লাসটি কেবলমাত্র একটি থ্রেড দ্বারা ব্যবহৃত হবে। এর অর্থ লকগুলি অকারণে আমাদের কোডটি ধীরে ধীরে কমিয়ে দেয় ... এখানেই সিএলআরের চৌকস আশাবাদ পারফরম্যান্স উন্নত করতে সহায়তা করতে পারে improve

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

মনো এবং ডটজিএনইউ উভয় কার্যকরভাবে লকিং / অপেক্ষার কাজ করতে মুটেক্সেস ব্যবহার করে তবে সত্যই প্রয়োজন না হওয়া পর্যন্ত একটি হার্ড লক সম্পাদন করার প্রয়োজনটিকে নির্মূল করার জন্য একটি স্পিনলক স্টাইল তুলনা-এবং এক্সচেঞ্জ অপারেশন ব্যবহার করুন :

আপনি কীভাবে এখানে মনিটরগুলি প্রয়োগ করা যেতে পারে তার একটি উদাহরণ দেখতে পাবেন:

http://cvs.savannah.gnu.org/viewvc/dotgnu-pnet/pnet/engine/lib_monitor.c?revision=1.7&view=markup


9

আপনি স্ট্রিং আইডি দিয়ে চিহ্নিত যে কোনও ভাগ করা মিটেক্সকে লক করার জন্য অতিরিক্ত সতর্কতা হ'ল এটি একটি "লোকাল \" মিটেক্সে ডিফল্ট হবে এবং একটি টার্মিনাল সার্ভার পরিবেশে সেশনগুলিতে ভাগ করা হবে না।

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


5

যদি আপনি পারেন তবে আমি "লক ()", "মুটেক্স" এবং "মনিটর" এড়াতে চেষ্টা করব ...

নতুন নেটস্পেস সিস্টেমটি দেখুন Col
সংগ্রহগুলি। নেট 4 এ সামঞ্জস্য করুন এটিতে কিছু দুর্দান্ত থ্রেড-নিরাপদ সংগ্রহের ক্লাস রয়েছে

http://msdn.microsoft.com/en-us/library/system.collections.concurrent.aspx

সমসাময়িক অভিধানে শিলা! আমার জন্য আর কোনও ম্যানুয়াল লকিং নেই!


2
লক এড়ান কিন্তু মনিটর ব্যবহার করবেন? কেন?
মাফু

@ মফুট্র্যাক্ট কারণ আপনাকে নিজেরাই সিঙ্ক্রোনাইজেশনের যত্ন নেওয়া উচিত।
পিটার Gfader

ওহ, এখন আমি এটি পেয়েছি, আপনি উল্লিখিত তিনটি ধারণার সমস্ত এড়াতে চেয়েছিলেন। দেখে মনে হচ্ছে আপনি মনিটর ব্যবহার করবেন তবে লক / মিটেক্স ব্যবহার করবেন না।
মাফু

কখনও সিস্টেম.কালেকশন.কমারেন্ট ব্যবহার করবেন না। এগুলি জাতিদের শর্তগুলির একটি প্রধান উত্স এবং কলার থ্রেডকে ব্লক করে।
আলেকজান্ডার ডানিলভ

-2

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

এবং আপনার অবশ্যই ক্লাস ব্যবহার করা উচিত নয় System.Collections.Concurrent - এগুলি জাতিদের শর্তের মূল উত্স কারণ একাধিক সংগ্রহের মধ্যে লেনদেনকে সমর্থন করে না এবং বর্তমান থ্রেডকে অবরুদ্ধ করে।

আশ্চর্যজনকভাবে .NET এর সিঙ্ক্রোনাইজেশনের কার্যকর ব্যবস্থা নেই।

আমি সি # তে জিসিডি ( ওয়ার্ল্ড) থেকে ক্রমিক ক্রোম প্রয়োগ করেছি Objc/Swift- খুব হালকা ওজনের, পরীক্ষার সাহায্যে থ্রেড পুল ব্যবহার করে এমন সিঙ্ক্রোনাইজেশন সরঞ্জামকে ব্লক করে না।

ডাটাবেস অ্যাক্সেস (হ্যালো স্ক্লাইট) থেকে ব্যবসায়িক যুক্তিতে কোনও কিছুর সিঙ্ক্রোনাইজ করার এটি সেরা উপায়।

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