সেমফোর - প্রাথমিক গণনার ব্যবহার কী?


91

http://msdn.microsoft.com/en-us/library/system.threading.semaphoreslim.aspx

একটি সেমফোর তৈরি করতে, আমাকে একটি প্রাথমিক গণনা এবং সর্বাধিক গণনা সরবরাহ করতে হবে। এমএসডিএন সূচিত করে যে একটি প্রাথমিক গণনা হ'ল -

একইসাথে মঞ্জুর করা যেতে পারে সেমফোর জন্য অনুরোধের প্রাথমিক সংখ্যা।

যদিও এটি বলে যে সর্বাধিক গণনা

একযোগে মঞ্জুর করা যায় সেমফোরের জন্য সর্বাধিক সংখ্যার অনুরোধ।

আমি বুঝতে পারি যে সর্বাধিক গণনা হ'ল সর্বাধিক সংখ্যক থ্রেড যা একই সাথে কোনও সংস্থান অ্যাক্সেস করতে পারে। তবে, প্রাথমিক গণনার ব্যবহার কী?

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

SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 2); //all threadpool threads wait
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 2);//only one thread has access to the resource at a time
SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2, 2);//two threadpool threads can access the resource concurrently

7
আপনি কীভাবে এসভিগ্রাগের উত্তর গ্রহণ করেন নি?
জন

উত্তর:


79

হ্যাঁ, যখন প্রাথমিক সংখ্যা 0 এ সেট হয় - আপনি "কারেন্টকাউন্ট" সম্পত্তি বাড়ানোর সময় সমস্ত থ্রেড অপেক্ষা করবে। আপনি এটি রিলিজ () বা রিলিজ (ইন্ট 32) দিয়ে করতে পারেন।

প্রকাশ (...) - সেমফোর কাউন্টারকে বাড়িয়ে দেবে

অপেক্ষা করুন (...) - এটি হ্রাস পাবে

আপনি সূচনাতে সেট করা সর্বাধিক গণনার চেয়ে কাউন্টারকে ("কারেন্টকাউন্ট" সম্পত্তি) বৃদ্ধি করতে পারবেন না।

উদাহরণ স্বরূপ:

SemaphoreSlim^ s = gcnew SemaphoreSlim(0,2); //s->CurrentCount = 0
s->Release(2); //s->CurrentCount = 2
...

s->Wait(); //Ok. s->CurrentCount = 1
...

s->Wait(); //Ok. s->CurrentCount = 0
...

s->Wait(); //Will be blocked until any of the threads calls Release()

4
আপনার কোডটি একটি মন্তব্য হিসাবে না বরং উত্তরে উপস্থাপন করা হবে।
ChrisF

14
LOL আমি সম্ভবত 5 তম বার এই একই উত্তর পৌঁছেছি কারণ কনস্ট্রাক্টরের ডকুমেন্টেশন আমাকে সর্বদা বিভ্রান্ত করে দেয় যে কোন মানগুলি সেট করতে হবে। চিয়ার্স
ব্লুস্ট্র্যাট

70

সুতরাং, আমি প্রাথমিক গণনার তাত্পর্য সম্পর্কে সত্যিই বিভ্রান্ত?

একটি গুরুত্বপূর্ণ পয়েন্ট যা এখানে সহায়তা করতে পারে তা হ'ল Waitসেমফোর গণনা হ্রাস এবং Releaseএটি বৃদ্ধি করে।

initialCountহ'ল সংস্থান অ্যাক্সেসের সংখ্যা যা তাত্ক্ষণিকভাবে অনুমোদিত হবে। অথবা, অন্য কথায়, এটি Waitসেমফোরটি তাত্ক্ষণিকভাবে ইনস্ট্যান্ট হওয়ার পরে অবিলম্বে অবরুদ্ধ না করে বার বলা যেতে পারে।

maximumCountসেমফোরটি পেতে পারে সর্বোচ্চ গণনা। এটি গণনা শূন্য Releaseবলে ধরে নিল ব্যতিক্রম ছাড়াই কল initialCountকরা যায়। যদি initialCountএকই মান হিসাবে সেট করা থাকে maximumCountতবে Releaseসেমফোরটি তাত্ক্ষণিকভাবে চালিত হওয়ার সাথে সাথে কল করা একটি ব্যতিক্রম ছুঁড়ে দেবে।


20
এটি এত সহায়ক! আমি সেম্যাফোর্সকে পশ্চাৎপদ সম্পর্কে ভাবছিলাম, যেমন প্রাথমিক অ্যাকাউন্টে প্রাথমিক ব্লক করা সংস্থার সংখ্যা, অবিলম্বে উপলব্ধ সংস্থানগুলির সংখ্যা নয়। ধন্যবাদ.
ফিলিপ টেন

4
ফিলিপটেন, আমি সম্মত - ডকুমেন্টেশন এই সম্মানের বিষয়ে স্পষ্ট নয়
ব্লুস্ট্র্যাট

আমি সম্মত হয়েছি, তাদের সেই পরিবর্তনশীল নামটি পরিবর্তন করা বা দস্তাবেজগুলি আপডেট করা উচিত
IronHide

@ স্যান্ডবক্সে আপনার এই উত্তরটি আইএমও গ্রহণ করা উচিত, কারণ এটি সত্যই initialCountপ্যারামিটারটির অর্থ ব্যাখ্যা করে ।
মিশা টার্কজিন

8

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

(এখানে দুটি কনস্ট্রাক্টর রয়েছে: একটি যা কেবলমাত্র প্রাথমিক মান নেয় এবং একটি অতিরিক্ত হিসাবে গণনা নেয় appropriate যাহা উপযুক্ত উপযুক্ত ব্যবহার করুন))


1

এইভাবে যখন বর্তমান থ্রেডটি সেমফোর তৈরি করে তখন এটি শুরু থেকে কিছু সংস্থান দাবি করতে পারে।


সুতরাং, আপনি বলতে চাইছেন যখন আমি দুটি কর্মী থ্রেডটি সংস্থানটিতে অ্যাক্সেস করতে চাই তবে আমার প্রাথমিক গণনাটি পরিবর্তন করা উচিত?
স্যান্ডবক্স

না এটি বর্তমান থ্রেড যা একটি গণনা দাবি করে। আপনি যদি না চান যে বর্তমান থ্রেডটি কোনও অ্যাক্সেস পাস 0 দাবি করতে পারে বা একটি প্যারামিটার দিয়ে ওভারলোড ব্যবহার করে।
এর্নো

1

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

hSemaphore = CreateSemaphoreA(NULL, 0, MAX_COUNT, NULL) ;

//Do something here
//No threads can access your resource

ReleaseSemaphore(hSemaphore, MAX_COUNT, 0) ;

//All threads can access the resource now

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


দুঃখিত, আমি আপনাকে সি ++ তে উদাহরণটি দিলেও সন্দেহটি পরিষ্কার করতে পারে।
অভিনেত্রী

0

সম্পদগুলির পুলকে সুরক্ষিত করতে সেমফোরস ব্যবহার করা যেতে পারে । আমরা তৈরির জন্য ব্যয়বহুল - যেমন ডাটাবেস সংযোগ হিসাবে পুনরায় ব্যবহার করতে সংস্থান পুল ব্যবহার করি use

সুতরাং প্রাথমিক গণনাটি কিছু প্রক্রিয়া শুরুর সময় পুলটিতে উপলব্ধ সংস্থানগুলির সংখ্যা বোঝায়। initialCountকোডটি পড়ার সময় আপনি কীভাবে সাম্প্রতিক প্রচেষ্টা চালিয়ে যাচ্ছেন এই সংস্থার পুলটি তৈরিতে আপনি কতটা চিন্তা করছেন তা বিবেচনা করা উচিত।

আমি প্রাথমিক গণনার তাত্পর্য সম্পর্কে সত্যিই বিভ্রান্ত?

Initial count = Upfront cost

যেমন, আপনার অ্যাপ্লিকেশনটির ব্যবহারের প্রোফাইলের উপর নির্ভর করে এই মানটি আপনার অ্যাপ্লিকেশনটির কার্য সম্পাদনে নাটকীয় প্রভাব ফেলতে পারে। এটি কেবল কিছু স্বেচ্ছাসেবী সংখ্যা নয়।

আপনি কী তৈরি করছেন, সেগুলি তৈরি করতে কত ব্যয়বহুল এবং আপনার এখনই কতগুলি প্রয়োজন তা আপনার যত্ন সহকারে চিন্তা করা উচিত। আপনি এই প্যারামিটারটির জন্য সর্বোত্তম মানটি আক্ষরিক অর্থে গ্রাফ করতে সক্ষম হবেন এবং সম্ভবত এটির কনফিগারযোগ্য করার বিষয়ে চিন্তাভাবনা করা উচিত যাতে আপনি প্রক্রিয়াটির সঞ্চালনের সময়টির সাথে সম্পাদন করতে পারেন।


-1

এমএসডিএন যেমন মন্তব্যসমূহ বিভাগে এটি ব্যাখ্যা করে:

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

সুতরাং প্রাথমিক গণনা যদি 0 হয় এবং সর্বোচ্চ 2 হয় তবে এটি হ'ল ওয়েটঅনকে মূল থ্রেড দ্বারা দু'বার ডেকে আনা হয়েছে তাই আমরা সক্ষমতা পৌঁছেছি (সেমফোর কাউন্টটি এখন 0 হয়) এবং কোনও থ্রেড সেমফোরে প্রবেশ করতে পারে না। একইভাবে প্রাথমিক গণনাটি যদি 1 হয় এবং সর্বোচ্চ 2 হয় তবে ওয়েটঅনস একবার কল করা হয়েছিল এবং আমরা আবার ক্ষমতা অর্জনের আগে কেবল একটি থ্রেড প্রবেশ করতে পারি।

যদি প্রাথমিক গণনার জন্য 0 ব্যবহার করা হয় তবে আমরা সর্বদা রিলিজ (2) কে সেমফোর কাউন্টকে সর্বাধিক সংখ্যক থ্রেড সংস্থান সঞ্চার করতে অনুমতি দিতে বৃদ্ধি করতে কল করতে পারি।

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