কিভাবে C++ এ মাল্টিথ্রেডিং প্রয়োগ করবেন

Kibhabe C E Maltithredim Prayoga Karabena



C++-এ মাল্টিথ্রেডিং হল এমন একটি বৈশিষ্ট্য যা একজনকে একযোগে একাধিক কাজ করতে দেয়। একটি থ্রেড হল একটি নির্দিষ্ট প্রক্রিয়ার কার্যকরী ইউনিট যা সম্পাদিত হচ্ছে। মাল্টিথ্রেডিং সঞ্চালনের জন্য অসংখ্য থ্রেড একই সময়ে একে অপরের থেকে স্বাধীনভাবে কার্যকর করে।

কিভাবে C++ এ মাল্টিথ্রেডিং প্রয়োগ করবেন

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







C++ এ মাল্টিথ্রেডিংয়ের জন্য পূর্ব-প্রয়োজনীয়

উইন্ডোজে, থ্রেড সম্পর্কিত ফাংশনগুলি C++ 11 এবং উন্নত সংস্করণে সঞ্চালিত হতে পারে। Dev-C++ কম্পাইলার ব্যবহার করার সময়, ডিফল্টরূপে এটি C++ 3 সংস্করণে থাকে, তাই এটিকে ম্যানুয়ালি C++ 11 সংস্করণে পরিবর্তন করতে হবে। ভাষা মান সেটিংস পরিবর্তন করে GNU C++11 পরিবেশ নির্বাচন করা যেতে পারে।



Dev-C++ কম্পাইলার খুলুন এবং টাস্কবারে 'Tools' এ যান। 'কম্পাইলার অপশন' নির্বাচন করুন এবং তারপর 'সেটিংস' নির্বাচন করুন, 'কোড জেনারেশন' ব্লকে ক্লিক করুন কমান্ডের একটি তালিকা প্রদর্শিত হবে। 'Language Standard(-std)' থেকে GNU C++11 নির্বাচন করুন এবং তারপর ওকে ক্লিক করুন। এখন এই কম্পাইলারটি থ্রেড অপারেশন সমর্থন করার জন্য প্রস্তুত।




GitHub থেকে লাইব্রেরি ডাউনলোড করুন এবং তাদের Cpp কম্পাইলারের lib ফোল্ডারে রাখুন। #include “mingw.thread.h” এবং হেডার ফাইল ব্যবহার করে প্রোগ্রামে এই লাইব্রেরিগুলিকে কল করুন, নীচে এর সিনট্যাক্স রয়েছে:





std::thread thread_object ( কলযোগ্য ) ;


std::thread C++11-এ #include “mingw.thread.h” হেডার ফাইল দ্বারা সমর্থিত। এটি একটি থ্রেড ক্লাস এবং একটি একক থ্রেড প্রতিনিধিত্ব করে। std::thread ব্যবহার করে একটি নতুন থ্রেড তৈরি করা হয় এবং এটিতে একটি কলযোগ্য পাস করা হয়। Callable হল একটি এক্সিকিউটেবল কোড, যেটি থ্রেড চলার সময় কার্যকর করা হয়। কলযোগ্য নীচে দেওয়া তিনটি প্রকারের যে কোনও হতে পারে:

যখন একটি বস্তু তৈরি করা হয়, এটি একটি নতুন থ্রেড চালু করে, যা কলযোগ্য কোডটি কার্যকর করে।



ফাংশন অবজেক্ট ব্যবহার করে থ্রেড চালু করা

একটি ফাংশন অবজেক্ট থ্রেড চালু করার জন্য কলযোগ্য হিসাবে ব্যবহার করা যেতে পারে, ওভারলোড অপারেটর () এটিকে কলযোগ্য করে তোলে:

class function_object_class {
অকার্যকর অপারেটর ( ) ( params )
{
বিবৃতি;
}
}
std::thread thread_object ( function_object_class ( ) , params )


ওভারলোড ফাংশন কনস্ট্রাক্টরকে প্রথম অবজেক্ট এবং স্টেটমেন্ট দ্বিতীয় অবজেক্ট হিসাবে প্রদান করা হয়।

ফাংশন পয়েন্টার ব্যবহার করে থ্রেড চালু করুন

একটি ফাংশন পয়েন্টার সংজ্ঞায়িত করা হয়, এবং তারপর এটি একটি থ্রেড চালু করার জন্য একটি কলযোগ্য হিসাবে ব্যবহার করা হয়:

void function_call ( পরম )
{
বিবৃতি;
}
std::thread thread_obj ( function_call, params ) ;


পাস করা আর্গুমেন্ট ফাংশনের নামের পরে লেখা হয়।

Lambda এক্সপ্রেশন ব্যবহার করে থ্রেড চালু করুন

থ্রেড অবজেক্ট একটি কলযোগ্য হিসাবে ল্যাম্বডা ব্যবহার করে চালু করা যেতে পারে।

// একটি ল্যাম্বডা অভিব্যক্তি সংজ্ঞায়িত করুন
auto f = [ ] ( params )
{
বিবৃতি;
} ;

std::thread thread_object ( f, params ) ;


ল্যাম্বডা এক্সপ্রেশনটি সংজ্ঞায়িত করা হয়েছে, এবং থ্রেড চালু করার জন্য প্যারামিটারগুলিকে বলা হয়েছে।

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

int প্রধান ( )
{

std::থ্রেড t1 ( কলযোগ্য ) ;
t1.যোগ দিন ( ) ;
বিবৃতি;
}

উদাহরণ

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

# অন্তর্ভুক্ত করুন
# অন্তর্ভুক্ত <থ্রেড>
নামস্থান std ব্যবহার করে;


void foo ( int Z )
{
জন্য ( int i = 0 ; i < জেড; i++ ) {
cout << 'ফাংশন ব্যবহার করে থ্রেড'
' কলযোগ্য হিসাবে পয়েন্টার \n ' ;
}
}


class thread_obj {
সর্বজনীন:
অকার্যকর অপারেটর ( ) ( int x )
{
জন্য ( int i = 0 ; i < এক্স; i++ )
cout << 'ফাংশন ব্যবহার করে থ্রেড'
' কলযোগ্য হিসাবে বস্তু \n ' ;
}
} ;


// প্রধান কোড
int প্রধান ( )
{
cout << 'থ্রেড 1 এবং 2 এবং 3'
'স্বাধীনভাবে কাজ করা'
<< endl;


থ্রেড th1 ( ফু, 3 ) ;


থ্রেড th2 ( thread_obj ( ) , 3 ) ;


auto f = [ ] ( int x ) {
জন্য ( int i = 0 ; i < এক্স; i++ )
cout << 'ল্যাম্বডা ব্যবহার করে থ্রেড'
'আহ্বানযোগ্য হিসাবে অভিব্যক্তি \n ' ;
} ;


থ্রেড th3 ( চ, 3 ) ;

th1.join ( ) ;

th2.join ( ) ;

th3.যোগ দিন ( ) ;

ফিরে 0 ;
}


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


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

উপসংহার

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