মিটেক্স এবং সমালোচনামূলক বিভাগের মধ্যে পার্থক্য কী?


134

লিনাক্স, উইন্ডোজ দৃষ্টিকোণ থেকে ব্যাখ্যা করুন?

আমি সি # তে প্রোগ্রামিং করছি, এই দুটি পদটি কোনও পার্থক্য আনবে। উদাহরণস্বরূপ এবং এর সাথে আপনি যতটা পারেন পোস্ট করুন ...

ধন্যবাদ

উত্তর:


232

উইন্ডোজের জন্য, সমালোচনা বিভাগগুলি মুটেক্সেসের চেয়ে হালকা ওজনযুক্ত।

প্রক্রিয়াগুলির মধ্যে মিটেক্সগুলি ভাগ করা যায় তবে সর্বদা কার্নেলের কাছে একটি সিস্টেম কল আসে যার কিছু ওভারহেড থাকে।

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

আমি একটি দ্রুত নমুনা অ্যাপ্লিকেশন লিখেছি যা তাদের দুজনের মধ্যে সময়ের তুলনা করে। আমার সিস্টেমে ১,০০,০০০ অপরিবর্তিত অর্জন এবং প্রকাশের জন্য, একটি মিটেক্স এক সেকেন্ডের বেশি সময় নেয়। একটি সমালোচনা বিভাগটি 1,000,000 অর্জনের জন্য ms 50 এমএস নেয়।

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

HANDLE mutex = CreateMutex(NULL, FALSE, NULL);
CRITICAL_SECTION critSec;
InitializeCriticalSection(&critSec);

LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
LARGE_INTEGER start, end;

// Force code into memory, so we don't see any effects of paging.
EnterCriticalSection(&critSec);
LeaveCriticalSection(&critSec);
QueryPerformanceCounter(&start);
for (int i = 0; i < 1000000; i++)
{
    EnterCriticalSection(&critSec);
    LeaveCriticalSection(&critSec);
}

QueryPerformanceCounter(&end);

int totalTimeCS = (int)((end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart);

// Force code into memory, so we don't see any effects of paging.
WaitForSingleObject(mutex, INFINITE);
ReleaseMutex(mutex);

QueryPerformanceCounter(&start);
for (int i = 0; i < 1000000; i++)
{
    WaitForSingleObject(mutex, INFINITE);
    ReleaseMutex(mutex);
}

QueryPerformanceCounter(&end);

int totalTime = (int)((end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart);

printf("Mutex: %d CritSec: %d\n", totalTime, totalTimeCS);

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

5
@ ট্রয়হওয়ার্ড আপনি কি এই মুহুর্তে কেবল স্পিন লকিংয়ের কাজ করছেন না?
dss539

এই পার্থক্যের কারণগুলি মূলত historicalতিহাসিক। আনক্যান্ডেন্ডেড কেস (কতিপয় পারমাণবিক নির্দেশনা, কোনও সিস্টোলস নেই) হিসাবে ক্রিটিক্যালসেকশন হিসাবে তত দ্রুত লকিং প্রয়োগ করা কঠিন নয়, তবুও প্রক্রিয়াগুলি জুড়ে কাজ করে (ভাগ করা মেমরির একটি অংশ সহ)। যেমন দেখুন লিনাক্স futexes
রেজনার্গ

2
@ ট্রয়হওয়ার্ড আপনার সিপিইউকে সর্বদা 100% চালাতে জোর করে দেখুন এবং INFINITE আরও ভাল কাজ করে কিনা তা দেখুন। পাওয়ার কৌশলটি আমার মেশিনে (ডেল এক্সপিএস-8700০০) যতক্ষণ না গতি কমিয়ে নেওয়ার সিদ্ধান্ত নেওয়ার পরে পুরো গতিতে ব্যাক আপ করতে পারে ততক্ষণ 40 মিনিট সময় লাগতে পারে, যা আপনি ঘুমান না হলে বা কেবলমাত্র এক মিলি সেকেন্ডের জন্য অপেক্ষা না করে তা নাও পারে।
স্টিভেনস মিলার

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

89

একটি তাত্ত্বিক দৃষ্টিকোণ থেকে, একটি সমালোচনা বিভাগ কোডের একটি অংশ যা একসাথে একাধিক থ্রেড দ্বারা চালিত হওয়া উচিত নয় কারণ কোডটি ভাগ করে নেওয়া সংস্থানগুলিকে অ্যাক্সেস করে।

একটি মিউটেক্স একটি অ্যালগরিদম (এবং কখনও কখনও ডেটা স্ট্রাকচারের নাম) যা সমালোচনা বিভাগগুলি রক্ষার জন্য ব্যবহৃত হয়।

Semaphores এবং মনিটর একটি mutex সাধারণ বাস্তবায়নের হয়।

অনুশীলনে উইন্ডোতে অনেকগুলি মুটিেক্স বাস্তবায়নযোগ্য। তারা তাদের লকিং স্তর, তাদের স্কোপস, তাদের ব্যয় এবং বিভিন্ন স্তরের মতবিরোধের অধীনে তাদের কার্যকারিতা দ্বারা প্রয়োগের ফলাফল হিসাবে পৃথক হয়। সিএলআর অভ্যন্তরে দেখুন - বিভিন্ন মুটেক্স বাস্তবায়নের ব্যয়গুলির একটি লেখচিত্রের জন্য স্কেলাবিলিটির জন্য একত্রে ব্যবহার করে rency

উপলভ্য সিঙ্ক্রোনাইজেশন আদিম।

lock(object)বক্তব্য ব্যবহার বাস্তবায়িত হয় Monitor- দেখুন দুটিই MSDN রেফারেন্সের জন্য।

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


গৃহীত উত্তরটি দেখে, আমি ভাবছিলাম যে সমালোচনামূলক বিভাগগুলির ধারণাটি আমি ভুল মনে করেছি, যতক্ষণ না দেখলাম আপনি লিখেছেন তাত্ত্বিক দৃষ্টিভঙ্গি । :)
অনিরুদ রমনাথন

2
প্রাকটিক্যাল লক ফ্রি প্রোগ্রামিং শানগ্রি লা এর মতো, এটির অস্তিত্ব ছাড়া। কায়ার ফ্রেজারের কাগজ (পিডিএফ) এটি বরং আকর্ষণীয়ভাবে আবিষ্কার করে (2004 এ ফিরে যাচ্ছে)। এবং আমরা এখনও 2012 সালে এটি নিয়ে লড়াই করছি We আমরা স্তন্যপান করি।
টিম পোস্ট

22

অন্যান্য উত্তরের পাশাপাশি, নিম্নলিখিত বিবরণগুলি উইন্ডোজের সমালোচনামূলক বিভাগগুলির জন্য সুনির্দিষ্ট:

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

লিনাক্সে, আমি মনে করি যে তাদের একটি "স্পিন লক" রয়েছে যা একটি স্পিন গণনা সহ সমালোচনামূলক বিভাগে অনুরূপ উদ্দেশ্যে কাজ করে।


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

2
এটি অবশ্যই সত্য নয়। সিএসএক্স ব্যবহারকারী মোডে সিএমপিএক্সচজি দিয়ে করা যেতে পারে।
মাইকেল

আমি ভেবেছিলাম ডিফল্ট স্পিন গণনাটি শূন্য ছিল যদি আপনি আরিনালাইজক্রিটিক্যালসেকশন নামে ডাকেন - আপনি যদি স্পিন গণনা প্রয়োগ করতে চান তবে আপনাকে আরিনালাইজক্রিটিক্যালসেকশনএন্ডস্পিনকাউন্ট কল করতে হবে। আপনি কি তার জন্য একটি রেফারেন্স আছে?
1800 তথ্য

18

ক্রিটিকাল বিভাগ এবং মুটেক্স অপারেটিং সিস্টেম নির্দিষ্ট নয়, তাদের মাল্টিথ্রেডিং / মাল্টিপ্রসেসিংয়ের ধারণা।

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

মিউটেক্স * মুটেক্স সমালোচনা বিভাগের কোডটি প্রয়োগ করার একটি উপায় (এটি একটি টোকেনের মতো মনে করুন ... সমালোচনা_কেন্দ্র_কোড চালানোর জন্য থ্রেডটির অবশ্যই এটির অধিকার থাকতে হবে)


2
এছাড়াও, mutexes প্রক্রিয়া জুড়ে ভাগ করা যায়।
Configurator

14

একটি মিউটেক্স এমন একটি বস্তু যা কোনও থ্রেড অর্জন করতে পারে, এটি অন্য থ্রেডগুলি অর্জন থেকে বাধা দেয়। এটি পরামর্শমূলক, বাধ্যতামূলক নয়; একটি থ্রেড মিটেক্স প্রতিনিধিত্ব করে এমন সংস্থানটি অর্জন না করে ব্যবহার করতে পারে।

একটি সমালোচনা বিভাগটি এমন একটি কোডের দৈর্ঘ্য যা অপারেটিং সিস্টেমের দ্বারা বাধা না দেওয়ার নিশ্চয়তা দেয়। সিউডো-কোডে এটি এমন হবে:

StartCriticalSection();
    DoSomethingImportant();
    DoSomeOtherImportantThing();
EndCriticalSection();

1
আমি মনে করি পোস্টারটি উইন 32 সমালোচনামূলক বিভাগের অবজেক্টের মতো ব্যবহারকারী মোড সিঙ্ক্রোনাইজেশন আদিম সম্পর্কে কথা বলছিল যা কেবল পারস্পরিক বর্জনকে সরবরাহ করে। আমি লিনাক্স সম্পর্কে জানি না, তবে উইন্ডোজ কার্নেলের সমালোচনামূলক অঞ্চল রয়েছে যা আপনার বর্ণনার মতো আচরণ করে - অবিঘ্নযোগ্য।
মাইকেল

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

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

ঠিক আছে, তিনি যথাসম্ভব বিশদ চেয়েছিলেন, এবং সুনির্দিষ্টভাবে বলেছিলেন যে উইন্ডোজ এবং লিনাক্স তাই ধারণাগুলির মতো শব্দগুলি ভাল। +1 - -1টি বুঝতে পারে না: /
জেসন কোকো

14

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

কোনও মিউটেক্স ভাগ করার জন্য আপনি নিযুক্ত করার উপায়গুলি ব্যবহার করে একটি ফুটেক্সও প্রক্রিয়াগুলির মধ্যে ভাগ করা যায়।

দুর্ভাগ্যক্রমে, futexes (পিডিএফ) বাস্তবায়নের জন্য খুব জটিল হতে পারে । (2018 আপডেট, তারা 2009 এর মতো ভয়ঙ্কর নয়))

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


6

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


6

কেবল আমার 2 সেন্ট যোগ করার জন্য, সমালোচনামূলক বিভাগগুলি একটি কাঠামো হিসাবে সংজ্ঞায়িত করা হয় এবং সেগুলির উপর ক্রিয়াকলাপগুলি ব্যবহারকারী-মোড প্রসঙ্গে উপস্থাপিত হয়।

ntdll! _RTL_CRITICAL_SECTION
   + 0x000 ডিবাগইনফো: Ptr32 _RTL_CRITICAL_SECTION_DEBUG
   + 0x004 লককাউন্ট: Int4B
   + 0x008 পুনরাবৃত্তি অ্যাকাউন্ট: Int4B
   + 0x00c মালিকানাধীন: Ptr32 শূন্য
   + 0x010 লকসেমাপোর: পিটিআর 32 শূন্য
   + 0x014 স্পিনকাউন্ট: Uint4B

উইন্ডোজ অবজেক্ট ডিরেক্টরিতে মুটেক্স হ'ল কার্নেল অবজেক্টস (এক্সমুটান্টজেক্টটাইপ)। মুটেক্স অপারেশনগুলি বেশিরভাগ কার্নেল-মোডে প্রয়োগ করা হয়। উদাহরণস্বরূপ, একটি মিউেক্স তৈরি করার সময়, আপনি কার্নেলের মধ্যে nt! NtCreateMutant কল করবেন।


এমন একটি প্রোগ্রাম যখন মেটেক্স অবজেক্টটি আরম্ভ এবং ব্যবহার করে, ক্রাশ হয় তখন কী ঘটে? মুটেক্স অবজেক্টটি কী স্বয়ংক্রিয়ভাবে বিলোপযুক্ত হয়ে যায়? না, আমি বলব। রাইট?
অঙ্কুর

6
কার্নেল অবজেক্টগুলির একটি রেফারেন্স গণনা রয়েছে। কোনও বস্তুর সাথে একটি হ্যান্ডেল বন্ধ করলে রেফারেন্স গণনা হ্রাস পায় এবং এটি 0 এ পৌঁছালে বস্তুটি মুক্ত হয়। যখন কোনও প্রক্রিয়া ক্র্যাশ হয়, তখন এর সমস্ত হ্যান্ডেলগুলি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়, সুতরাং কেবলমাত্র সেই প্রক্রিয়াটির একটি হ্যান্ডেল রয়েছে এমন একটি মিউটেক্স স্বয়ংক্রিয়ভাবে বিলম্বিত হবে।
মাইকেল

আর এ কারণেই ক্রিটিকাল বিভাগের অবজেক্টগুলি প্রক্রিয়াধীন, অন্যদিকে মিউটেক্সগুলি প্রক্রিয়াগুলিতে ভাগ করা যায়।
সিসির

2

মাইকেল এর দুর্দান্ত উত্তর। আমি সি ++ 11-এ প্রবর্তিত মুটেক্স ক্লাসের জন্য একটি তৃতীয় পরীক্ষা যুক্ত করেছি। ফলাফলটি কিছুটা আকর্ষণীয় এবং এখনও একক প্রক্রিয়ার জন্য CRITICAL_SECTION অবজেক্টগুলির তার মূল সমর্থনটি সমর্থন করে।

mutex m;
HANDLE mutex = CreateMutex(NULL, FALSE, NULL);
CRITICAL_SECTION critSec;
InitializeCriticalSection(&critSec);

LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
LARGE_INTEGER start, end;

// Force code into memory, so we don't see any effects of paging.
EnterCriticalSection(&critSec);
LeaveCriticalSection(&critSec);
QueryPerformanceCounter(&start);
for (int i = 0; i < 1000000; i++)
{
    EnterCriticalSection(&critSec);
    LeaveCriticalSection(&critSec);
}

QueryPerformanceCounter(&end);

int totalTimeCS = (int)((end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart);

// Force code into memory, so we don't see any effects of paging.
WaitForSingleObject(mutex, INFINITE);
ReleaseMutex(mutex);

QueryPerformanceCounter(&start);
for (int i = 0; i < 1000000; i++)
{
    WaitForSingleObject(mutex, INFINITE);
    ReleaseMutex(mutex);
}

QueryPerformanceCounter(&end);

int totalTime = (int)((end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart);

// Force code into memory, so we don't see any effects of paging.
m.lock();
m.unlock();

QueryPerformanceCounter(&start);
for (int i = 0; i < 1000000; i++)
{
    m.lock();
    m.unlock();
}

QueryPerformanceCounter(&end);

int totalTimeM = (int)((end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart);


printf("C++ Mutex: %d Mutex: %d CritSec: %d\n", totalTimeM, totalTime, totalTimeCS);

আমার ফলাফলগুলি ছিল 217, 473, এবং 19 (নোট করুন যে আমার দু'বারের সময়ের অনুপাতটি মাইকের সাথে প্রায় তুলনামূলক, তবে আমার মেশিন তার চেয়ে কমপক্ষে চার বছর কম বয়সী), সুতরাং আপনি 2009 এবং 2013 এর মধ্যে বর্ধিত গতির প্রমাণ দেখতে পাচ্ছেন , যখন এক্সপিএস-8700 বেরিয়েছে)। নতুন মিউটেক্স ক্লাসটি উইন্ডোজ মিটেক্সের দ্বিগুণ গতিযুক্ত, তবে এখনও উইন্ডোজ ক্রিটিক্যাল_সেকশন বস্তুর গতি দশমের চেয়ে কম। মনে রাখবেন যে আমি কেবল অ-পুনরাবৃত্ত মিটেক্স পরীক্ষা করেছি। CRITICAL_SECTION অবজেক্টগুলি পুনরাবৃত্ত হয় (একটি থ্রেড তাদের বারবার প্রবেশ করতে পারে, তবে এটি একই সংখ্যার বার ছেড়ে যায়)।


0

এটির প্রকৃত পরামিতিগুলি কেবল যদি ব্যবহার করে তবে এসি ফাংশনগুলিকে রিেন্টেন্ট বলা হয়।

একই সময়ে একাধিক থ্রেড দ্বারা প্রেরণকারী ফাংশনগুলি কল করা যেতে পারে।

প্রেরণকারী কার্যের উদাহরণ:

int reentrant_function (int a, int b)
{
   int c;

   c = a + b;

   return c;
}

অ-প্রেরণকারী ফাংশনের উদাহরণ:

int result;

void non_reentrant_function (int a, int b)
{
   int c;

   c = a + b;

   result = c;

}

সি স্ট্যান্ডার্ড লাইব্রেরি স্ট্রোক () প্রেরণকারী নয় এবং একই সাথে 2 বা ততোধিক থ্রেড ব্যবহার করতে পারে না।

কিছু প্ল্যাটফর্ম এসডিকে'র স্ট্র্টোক () নামক আর্ট্রোক-র () নামক সংস্করণটি আসে;

এনরিকো মিগলিওর

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