C++ Mutex লক

C Mutex Laka



C++ ভাল পারফরম্যান্স, উচ্চ নির্ভুলতা, এবং একটি পর্যাপ্ত মেমরি ম্যানেজমেন্ট সিস্টেম সহ দ্রুততম প্রোগ্রামিং ভাষাগুলির মধ্যে একটি হিসাবে পরিচিত। এই প্রোগ্রামিং ভাষাটি একাধিক থ্রেডের সমসাময়িক সম্পাদনকে সমর্থন করে এবং তাদের মধ্যে একাধিক সংস্থান ভাগ করে নেয়। মাল্টিথ্রেডিং-এ, থ্রেডটি শুধুমাত্র পঠিত ক্রিয়াকলাপ সম্পাদন করার জন্য যা কোন সমস্যা করে না যেহেতু থ্রেডটি সেই সময়ে অন্যান্য থ্রেডগুলি যা করছে তার দ্বারা প্রভাবিত হয় না। কিন্তু যদি এই থ্রেডগুলিকে তাদের মধ্যে সংস্থানগুলি ভাগ করে নিতে হয় তবে একটি থ্রেড সেই সময়ে ডেটা পরিবর্তন করতে পারে যা সমস্যা তৈরি করে। এই সমস্যাটি মোকাবেলা করার জন্য, আমাদের কাছে রয়েছে C++ 'Mutex' যা আমাদের কোড/অবজেক্টের দিকে একাধিক রিসোর্সের অ্যাক্সেসকে বাধা দেয় সিঙ্ক্রোনাইজেশন প্রদান করে যা বলে যে অবজেক্ট/কোডের অ্যাক্সেস একবারে শুধুমাত্র একটি থ্রেডে প্রদান করা যেতে পারে, যাতে একাধিক থ্রেড একই সাথে সেই বস্তুটি অ্যাক্সেস করতে সক্ষম হবে না।

পদ্ধতি:

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







বাক্য গঠন:

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



$ std :: মিউটেক্স mut_x

$mut_x তালা ( ) ;

অকার্যকর func_name ( ) {

$ // আমরা যে কোডটি লুকাতে চাই তার একাধিক থ্রেড এখানে লেখা হবে

$mut_x আনলক ( ) ;

}

আমরা এখন এই সিনট্যাক্সটিকে ডামি উদাহরণে এবং ছদ্ম কোডে ব্যবহার করব (যেটি কোড এডিটরের মতো আমরা চালাতে পারি না) আপনাকে জানাতে যে আমরা এই সিনট্যাক্সটি সঠিকভাবে কীভাবে ব্যবহার করতে পারি যা নীচে উল্লেখ করা হয়েছে:



$ std :: মিউটেক্স mut_x

অকার্যকর ব্লক ( ) {

$mut_x তালা ( ) ;

$ std :: cout << 'হ্যালো' ;

$mut_x আনলক ( ) ;

}

উদাহরণ:

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





$ # অন্তর্ভুক্ত করুন

$ # অন্তর্ভুক্ত করুন

$ # অন্তর্ভুক্ত

'iostream' লাইব্রেরি আমাদেরকে একটি ফাংশন প্রদান করে ডেটাকে Cout হিসাবে প্রদর্শন করতে, ডেটাকে Cin হিসাবে পড়তে এবং বিবৃতিটিকে endl হিসাবে শেষ করতে। আমরা থ্রেড থেকে প্রোগ্রাম বা ফাংশন ব্যবহার করার জন্য 'থ্রেড' লাইব্রেরি ব্যবহার করি। 'মিউটেক্স' লাইব্রেরি আমাদের কোডে মিউটেক্স লক এবং আনলক উভয়ই বাস্তবায়ন করতে দেয়। আমরা '# অন্তর্ভুক্ত' ব্যবহার করি কারণ এটি কোডে অন্তর্ভুক্ত লাইব্রেরি সম্পর্কিত সমস্ত প্রোগ্রামকে অনুমতি দেয়।

এখন, পূর্ববর্তী ধাপটি সম্পন্ন করার পরে, আমরা std ব্যবহার করে mutex এর জন্য mutex ক্লাস বা একটি গ্লোবাল ভেরিয়েবল সংজ্ঞায়িত করি। তারপর, আমরা মিউটেক্স লক এবং আনলকের জন্য একটি ফাংশন তৈরি করি যা আমরা কোডে পরে কল করতে পারি। এই উদাহরণে, আমরা ব্লক হিসাবে এই ফাংশন নাম. ব্লক ফাংশনের বডিতে, আমরা প্রথমে “mutex.lock()” কল করি এবং কোডের লজিক লেখা শুরু করি।



mutex.lock() আমাদের তৈরি বস্তু বা কোডে পৌঁছানোর জন্য অন্যান্য থ্রেডের অ্যাক্সেস অস্বীকার করে যাতে শুধুমাত্র একটি থ্রেড একবারে আমাদের অবজেক্ট পড়তে পারে। যুক্তিতে, আমরা একটি লুপ চালাই যা সূচকে 0 থেকে 9 পর্যন্ত চলে। আমরা লুপে মানগুলি প্রদর্শন করি। একবার এই লজিকটি মিউটেক্স লকের অপারেশন সম্পন্ন হওয়ার পরে বা লজিক থেকে বেরিয়ে আসার পরে তৈরি হয়ে গেলে, আমরা 'mutex.unlock()' পদ্ধতিকে কল করি। এই মেথড কলটি আমাদেরকে মিউটেক্স লক থেকে তৈরি বস্তুটিকে আনলক করতে দেয় যেহেতু একটি একক থ্রেডে অবজেক্টের অ্যাক্সেস আগে দেওয়া হয়েছিল এবং একবারে একবারে একটি থ্রেড দ্বারা সেই অবজেক্টে অপারেশন করা হয়। আমরা এখন চাই যে অন্যান্য থ্রেডগুলিও সেই বস্তু বা কোডটি অ্যাক্সেস করুক। অন্যথায়, আমাদের কোডটি 'অচলাবস্থা' অবস্থায় চলে যায় যার ফলে মিউটেক্সের সাথে তৈরি বস্তুটি চিরতরে লক অবস্থায় থাকে এবং অন্য কোন থ্রেড সেই বস্তুটি অ্যাক্সেস করতে সক্ষম হবে না। অত:পর, একটি অসম্পূর্ণ অপারেশন সঞ্চালিত হতে থাকে। এর পরে, আমরা ব্লক ফাংশন থেকে প্রস্থান করি এবং মূলে চলে যাই।

মূলে, আমরা থ্রেড 1, থ্রেড2, এবং থ্রেড3 ইত্যাদি নাম দিয়ে 'std :: থ্রেড থ্রেড_নাম (এখানে ইতিমধ্যে তৈরি ব্লক ফাংশনটি যেখানে আমরা মিউটেক্স তৈরি করেছি)' ব্যবহার করে তিনটি থ্রেড তৈরি করে আমাদের তৈরি মিউটেক্স প্রদর্শন করি। এইভাবে, তিনটি থ্রেড তৈরি করা হয়। তারপরে আমরা এই তিনটি থ্রেডে যোগ দিই যাতে 'থ্রেড_নাম' কল করে একই সাথে কার্যকর করা যায়। join()” পদ্ধতি। এবং তারপর, আমরা শূন্য সমান মান ফেরত. উদাহরণের পূর্বে উল্লিখিত ব্যাখ্যাটি কোড আকারে প্রয়োগ করা হয়েছে যা নিম্নলিখিত চিত্রে দেখানো যেতে পারে:

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

উপসংহার

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