Multithreading এবং Concurrency (মাল্টিথ্রেডিং এবং কনকারেন্সি)

অবজেক্টিভ-সি (Objective-C) - Computer Programming

259

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


1. মাল্টিথ্রেডিং (Multithreading)

মাল্টিথ্রেডিং হল একসাথে একাধিক থ্রেডের মাধ্যমে কাজ সম্পাদন করা। এক থ্রেড হল প্রোগ্রাম চলাকালীন কাজ করার একটি ইউনিট, যা একবারে একটি নির্দিষ্ট কাজ করে। মাল্টিথ্রেডিং-এ একাধিক থ্রেড একসাথে বিভিন্ন কাজ করতে পারে। এটি একাধিক কার্যক্রম (tasks) পরিচালনার জন্য ব্যবহৃত হয়, যা একে অপরের সাথে সমান্তরালভাবে চলতে পারে।

মাল্টিথ্রেডিং এর সুবিধা:

  • পারফরম্যান্স উন্নতি: একাধিক থ্রেড ব্যবহার করে একাধিক কাজ একসাথে করা যেতে পারে, ফলে পারফরম্যান্সের উন্নতি হয়।
  • অ্যাসিঙ্ক্রোনাস কাজ: ব্যবহারকারী ইন্টারফেস (UI) থ্রেডের মধ্যে কোনও কাজ ব্লক না হয়ে ব্যাকগ্রাউন্ড থ্রেডে বড় কাজ সম্পাদন করা যায়।

মাল্টিথ্রেডিং উদাহরণ (Objective-C):

// মাল্টিথ্রেডিং উদাহরণ: NSOperationQueue ব্যবহার
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[queue addOperationWithBlock:^{
    // ব্যাকগ্রাউন্ড থ্রেডে কাজ
    NSLog(@"Task 1 is executing on thread: %@", [NSThread currentThread]);
}];

[queue addOperationWithBlock:^{
    // ব্যাকগ্রাউন্ড থ্রেডে কাজ
    NSLog(@"Task 2 is executing on thread: %@", [NSThread currentThread]);
}];

এখানে, দুটি আলাদা থ্রেডে দুটি কাজ NSOperationQueue এর মাধ্যমে একসাথে চালানো হয়েছে।


2. কনকারেন্সি (Concurrency)

কনকারেন্সি হল একটি ধারণা যেখানে একাধিক কাজ একসাথে পরিচালিত হতে পারে, তবে এগুলি একসাথে বাস্তবায়ন নাও হতে পারে। এটি থ্রেডিংয়ের মতো কাজের সমান্তরাল কার্যপ্রণালী হতে পারে, কিন্তু কনকারেন্সি সবার জন্য এক সময়ের মধ্যে প্রক্রিয়া চালানোর গ্যারান্টি দেয় না। কনকারেন্সি থ্রেডগুলির মধ্যে সমন্বয় প্রতিষ্ঠিত করে, যাতে তারা একে অপরের সাথে সংঘর্ষ না করে কাজ করতে পারে।

কনকারেন্সি এর সুবিধা:

  • প্রতিক্রিয়া প্রদান: একটি অ্যাপ্লিকেশনের UI থ্রেড ব্যবহারকারীর সাথে প্রতিক্রিয়া প্রদান করে, যখন ব্যাকগ্রাউন্ড থ্রেড অন্যান্য কাজ সম্পাদন করে, এটি অ্যাপ্লিকেশনকে আরও দ্রুত এবং রেসপন্সিভ করে তোলে।
  • থ্রেড সিঙ্ক্রোনাইজেশন: একাধিক থ্রেডের মধ্যে সমন্বয় প্রতিষ্ঠিত করে কনকারেন্সি সঠিকভাবে কাজ নিশ্চিত করে।

কনকারেন্সি উদাহরণ (Objective-C):

// কনকারেন্সি উদাহরণ: GCD (Grand Central Dispatch) ব্যবহার
dispatch_queue_t queue = dispatch_queue_create("com.example.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{
    // ব্যাকগ্রাউন্ড থ্রেডে কাজ
    NSLog(@"Task 1 is executing on thread: %@", [NSThread currentThread]);
});

dispatch_async(queue, ^{
    // ব্যাকগ্রাউন্ড থ্রেডে কাজ
    NSLog(@"Task 2 is executing on thread: %@", [NSThread currentThread]);
});

এখানে, dispatch_queue_create ব্যবহার করে কনকারেন্ট কিউ তৈরি করা হয়েছে, যা দুইটি আলাদা কাজ একই সাথে প্রক্রিয়া করে। dispatch_async ব্যবহার করে এই কাজগুলোকে ব্যাকগ্রাউন্ডে পাঠানো হয়েছে।


3. মাল্টিথ্রেডিং এবং কনকারেন্সি মধ্যে পার্থক্য

বৈশিষ্ট্যমাল্টিথ্রেডিংকনকারেন্সি
কাজের ধরনের সমান্তরালতাএকাধিক থ্রেডে কাজ একসাথে চালানো হয়।কাজগুলোকে সমান্তরালভাবে ব্যবস্থাপনা করা হয়, কিন্তু একসাথে চলতে নাও পারে।
থ্রেডের সংখ্যাএকাধিক থ্রেড একযোগে কাজ করে।একাধিক কাজ একযোগে চালানো হয়, কিন্তু কম থ্রেডে তা পরিচালিত হতে পারে।
কার্যক্রমের সমন্বয়সম্পূর্ণ সমান্তরাল (parallel execution)।কাজগুলো একসাথে কাজ করতে পারে, কিন্তু সম্পূর্ণ সমান্তরাল নয়।
সিস্টেম রিসোর্সসিস্টেমের রিসোর্স বেশি খরচ হয়।রিসোর্সের দক্ষ ব্যবহার, কম থ্রেড ব্যবহৃত হতে পারে।
উদাহরণএকাধিক থ্রেডে নির্দিষ্ট কাজ চালানো।একাধিক কাজকে সমন্বিতভাবে পরিচালনা করা।

4. মাল্টিথ্রেডিং এবং কনকারেন্সির জন্য ব্যবহৃত টেকনিক

  • GCD (Grand Central Dispatch): এটি অ্যাসিঙ্ক্রোনাস এবং কনকারেন্ট কার্যক্রমের জন্য ব্যবহৃত হয়।
  • NSOperationQueue: এটি থ্রেডিং এবং কনকারেন্সি ব্যবস্থাপনার জন্য একটি উচ্চ স্তরের API, যেখানে আপনি নির্দিষ্ট কাজ কনকারেন্ট থ্রেডে চালাতে পারেন।
  • Dispatch Queues: সিরিয়াল এবং কনকারেন্ট কিউ ব্যবহার করা হয় একাধিক কাজ একসাথে পরিচালনা করতে।

উদাহরণ: GCD (Grand Central Dispatch)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // ব্যাকগ্রাউন্ড থ্রেডে কাজ
    NSLog(@"Task is running on: %@", [NSThread currentThread]);
});

এখানে, dispatch_get_global_queue একটি ব্যাকগ্রাউন্ড থ্রেডে কাজ চালানোর জন্য ব্যবহৃত হয়েছে।


5. সারাংশ

  • মাল্টিথ্রেডিং এবং কনকারেন্সি হল একাধিক কাজ একসাথে পরিচালনা করার দুটি ভিন্ন কৌশল। মাল্টিথ্রেডিং একাধিক থ্রেডে কাজ সম্পাদন করে, আর কনকারেন্সি একাধিক কাজের সমন্বয়ের মাধ্যমে কার্য সম্পাদন করে।
  • GCD এবং NSOperationQueue Objective-C তে মাল্টিথ্রেডিং এবং কনকারেন্সি বাস্তবায়ন করতে সহায়ক টুল।
  • মাল্টিথ্রেডিং কার্যক্রমের ক্ষেত্রে থ্রেড সিঙ্ক্রোনাইজেশন অত্যন্ত গুরুত্বপূর্ণ, যেখানে কনকারেন্সির ক্ষেত্রে কাজগুলোকে সঠিকভাবে সমন্বিত করতে হয়।

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

Content added By

NSThread এবং Grand Central Dispatch (GCD) হল iOS এবং macOS অ্যাপ্লিকেশন ডেভেলপমেন্টে মাল্টি-থ্রেডিং এবং অ্যাসিঙ্ক্রোনাস কার্যক্রম পরিচালনা করার জন্য ব্যবহৃত দুটি গুরুত্বপূর্ণ টুল। এগুলি অ্যাপ্লিকেশনের কার্যক্ষমতা উন্নত করতে এবং দীর্ঘ সময় নিয়ে কাজ করা অ্যাসিঙ্ক্রোনাস কার্যকলাপ পরিচালনা করতে সহায়তা করে। এখানে NSThread এবং GCD এর ব্যবহার এবং পার্থক্য আলোচনা করা হবে।


1. NSThread

NSThread হল Objective-C তে মাল্টি-থ্রেডিং এর জন্য ব্যবহৃত একটি ক্লাস। এটি বিভিন্ন থ্রেড তৈরি করে, যার মাধ্যমে কোডের বিভিন্ন অংশ একযোগে চালানো যায়। একাধিক থ্রেডের মাধ্যমে একাধিক কাজ সমান্তরালভাবে (parallel) সম্পন্ন করা সম্ভব, যাতে অ্যাপ্লিকেশন দ্রুত ও দক্ষভাবে কাজ করতে পারে।

NSThread এর মৌলিক গঠন:

NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(runTask) object:nil];
[thread start];
  • initWithTarget:selector:object:: এই মেথডের মাধ্যমে একটি নতুন থ্রেড তৈরি করা হয়, যেখানে target হল থ্রেডের কাজ সম্পাদন করার জন্য ক্লাস, selector হল সেই কাজের জন্য মেথড এবং object হল প্যারামিটার (যদি থাকে)।
  • start: এটি থ্রেডটি চালু করে।

NSThread এর উদাহরণ:

// Method to run on a background thread
- (void) runTask {
    NSLog(@"Task started on thread: %@", [NSThread currentThread]);
    
    // Simulate some task
    [NSThread sleepForTimeInterval:3];
    
    NSLog(@"Task completed on thread: %@", [NSThread currentThread]);
}

// Create and start the thread
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(runTask) object:nil];
[thread start];

এখানে, runTask মেথডটি একটি নতুন থ্রেডে চালানো হবে, যা ৩ সেকেন্ডের জন্য স্লিপ করবে এবং তারপর থ্রেডটি শেষ হবে।

NSThread এর বৈশিষ্ট্য:

  • Manual Thread Management: NSThread ব্যবহার করে থ্রেডগুলির ম্যানুয়াল নিয়ন্ত্রণ করা সম্ভব (যেমন থ্রেড স্টপ করা বা ম্যানুয়ালি থ্রেডের অবস্থান চেক করা)।
  • কমপ্লেক্স: NSThread সাধারণত কমপ্লেক্স এবং থ্রেডের লাইফসাইকেল ম্যানেজ করতে বেশি কোড লাগে।

2. GCD (Grand Central Dispatch)

GCD (Grand Central Dispatch) হল একটি শক্তিশালী এবং দক্ষ টুল যা অ্যাসিঙ্ক্রোনাস কোড এক্সিকিউশন এবং মাল্টি-থ্রেডিং হ্যান্ডেল করতে ব্যবহৃত হয়। GCD এর মাধ্যমে থ্রেড তৈরি করা হয় না, বরং এটি থ্রেড পুলের মাধ্যমে কাজগুলো পরিচালনা করে, যার ফলে থ্রেড ম্যানেজমেন্ট স্বয়ংক্রিয়ভাবে করা যায়। এটি সিস্টেম রিসোর্স ব্যবস্থাপনা (যেমন, CPU কোর) উন্নত করে।

GCD এর মৌলিক গঠন:

  1. Dispatch Queues: GCD কাজ পরিচালনা করার জন্য Dispatch Queues ব্যবহার করে। দুটি প্রধান ধরনের Dispatch Queue রয়েছে:
    • Serial Queue: কাজগুলো একে একে সম্পন্ন হয়।
    • Concurrent Queue: কাজগুলো সমান্তরালভাবে (parallel) সম্পন্ন হয়।
  2. Asynchronous and Synchronous Execution: GCD অ্যাসিঙ্ক্রোনাস এবং সিঙ্ক্রোনাস কোড এক্সিকিউশন সমর্থন করে।

GCD এর উদাহরণ:

Asynchronous Execution (অ্যাসিঙ্ক্রোনাস এক্সিকিউশন):

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Background task
    NSLog(@"Task started on background queue");
    [NSThread sleepForTimeInterval:3];
    NSLog(@"Task completed on background queue");
    
    // Update UI on main thread
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"UI updated on main thread");
    });
});

এখানে, প্রথমে dispatch_async ব্যবহার করে একটি ব্যাকগ্রাউন্ড থ্রেডে কাজ চালানো হচ্ছে, তারপর UI আপডেট করার জন্য dispatch_async(dispatch_get_main_queue()) ব্যবহার করা হয়েছে, যা মূল থ্রেডে কাজ সম্পন্ন করবে।

Synchronous Execution (সিঙ্ক্রোনাস এক্সিকিউশন):

dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Synchronous task
    NSLog(@"Task started on global queue");
    [NSThread sleepForTimeInterval:3];
    NSLog(@"Task completed on global queue");
});

এখানে, dispatch_sync ব্যবহার করে একটি সিঙ্ক্রোনাস কাজ সম্পন্ন করা হয়েছে, যেখানে কাজ শেষ না হওয়া পর্যন্ত পরবর্তী কাজ শুরু হবে না।

GCD এর বৈশিষ্ট্য:

  • Automatic Thread Management: GCD থ্রেড ম্যানেজমেন্ট স্বয়ংক্রিয়ভাবে পরিচালনা করে, তাই ডেভেলপারকে থ্রেড ম্যানেজমেন্টের জন্য অতিরিক্ত কোড লিখতে হয় না।
  • Efficiency: GCD সিস্টেম রিসোর্স যেমন CPU কোরের ব্যবহার দক্ষতার সাথে করে।
  • Simplified Syntax: GCD এর সিনট্যাক্স অনেক সরল এবং থ্রেড ম্যানেজমেন্টের জন্য অতিরিক্ত কোড লেখার প্রয়োজন হয় না।
  • Concurrency Support: GCD স্বয়ংক্রিয়ভাবে concurrent tasks পরিচালনা করতে পারে, যার ফলে অ্যাপ্লিকেশন দ্রুত এবং দক্ষভাবে কাজ করতে পারে।

3. NSThread vs GCD

বৈশিষ্ট্যNSThreadGCD
থ্রেড ম্যানেজমেন্টডেভেলপারকে থ্রেড ম্যানেজ করতে হয়স্বয়ংক্রিয়ভাবে থ্রেড ম্যানেজমেন্ট হয়
কার্যকারিতাএকাধিক থ্রেড তৈরি এবং নিয়ন্ত্রণ করা যায়একাধিক কাজকে দ্রুত এবং দক্ষভাবে পরিচালনা করা যায়
সিনট্যাক্সজটিল সিনট্যাক্সসরল এবং পরিষ্কার সিনট্যাক্স
থ্রেড পুলথ্রেড পুল নেইথ্রেড পুল রয়েছে যা থ্রেড ম্যানেজমেন্ট সহজ করে
ব্যবহারদীর্ঘ কাজ বা স্পেশালাইজড থ্রেড ম্যানেজমেন্টঅ্যাসিঙ্ক্রোনাস কাজ বা মাল্টি-থ্রেডিং সহজ করতে

সারাংশ

  • NSThread হল একটি শক্তিশালী থ্রেডিং টুল যা থ্রেড ম্যানেজমেন্টে ডেভেলপারকে বেশি নিয়ন্ত্রণ দেয়, তবে এটি বেশি কোড লেখার প্রয়োজন হয় এবং থ্রেড ম্যানেজমেন্টে জটিলতা হতে পারে।
  • GCD হল একটি আধুনিক, সহজ এবং দক্ষ মাল্টি-থ্রেডিং টুল যা স্বয়ংক্রিয়ভাবে থ্রেড ম্যানেজমেন্ট করে এবং অ্যাসিঙ্ক্রোনাস কাজের জন্য বেশি কার্যকরী।

দ্বিতীয় ক্ষেত্রে, GCD বেশি ব্যবহৃত হয় কারণ এটি থ্রেড ম্যানেজমেন্ট সহজ করে এবং সিস্টেম রিসোর্স ব্যবহারের কার্যক্ষমতা বৃদ্ধি করে।

Content added By

Objective-C তে Asynchronous Tasks এবং Queues হল অ্যাসিনক্রোনাস অপারেশন এবং মাল্টিথ্রেডিংয়ের গুরুত্বপূর্ণ অংশ। এগুলি বিশেষভাবে ব্যবহার করা হয় যখন আপনি দীর্ঘ-running কাজ করতে চান, যেমন নেটওয়ার্ক কল, ফাইল অপারেশন, বা বড় ডেটা প্রসেসিং, যাতে অ্যাপ্লিকেশন ইউজার ইন্টারফেস (UI) ব্লক না হয়। Asynchronous tasks এবং Queues আপনাকে পটভূমিতে কাজ করতে দেয়, এবং এগুলির মাধ্যমে প্রোগ্রামের পারফরম্যান্স এবং সাড়া দেওয়ার ক্ষমতা উন্নত হয়।


1. Asynchronous Tasks (অ্যাসিনক্রোনাস টাস্ক)

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

Objective-C তে অ্যাসিনক্রোনাস টাস্কের জন্য Grand Central Dispatch (GCD) এবং NSOperationQueue ব্যবহৃত হয়।

GCD (Grand Central Dispatch):

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

GCD সিনট্যাক্স:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // কাজ যা ব্যাকগ্রাউন্ডে সম্পন্ন হবে
    NSLog(@"Background task started");
    // কিছু লম্বা-running কাজ
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI আপডেট
        NSLog(@"Back to main queue to update UI");
    });
});

এখানে, প্রথমে একটি অ্যাসিনক্রোনাস কাজ dispatch_async এর মাধ্যমে dispatch_get_global_queue তে পাঠানো হয়েছে। এর পরে, কাজটি শেষ হলে dispatch_async দিয়ে মূল থ্রেডে ফিরে এসে UI আপডেট করা হচ্ছে।


2. Queues (কিউ)

Queues হল এমন একটি ডেটা স্ট্রাকচার যা কাজের (tasks) সিরিয়াল বা প্যারালাল এক্সিকিউশন পরিচালনা করে। Objective-C তে কিউ দুটি প্রধান ধরণের হয়: Serial Queue এবং Concurrent Queue

  • Serial Queue (সিরিয়াল কিউ): এই কিউতে কাজগুলো একটি একটার পর একটি সিরিয়াল ভাবে (তিনের অপেক্ষায়) এক্সিকিউট হয়। অর্থাৎ, এক কাজ শেষ হওয়ার পরেই পরবর্তী কাজ শুরু হয়।
  • Concurrent Queue (কনকারেন্ট কিউ): এই কিউতে কাজগুলি একসাথে বা কনকারেন্টলি এক্সিকিউট হয়। একাধিক কাজ একসাথে রান করতে পারে।

GCD Queues এর ব্যবহার:

Serial Queue Example:

dispatch_queue_t serialQueue = dispatch_queue_create("com.myapp.serialQueue", NULL);

dispatch_async(serialQueue, ^{
    NSLog(@"Task 1 started");
    // কিছু লম্বা-running কাজ
});

dispatch_async(serialQueue, ^{
    NSLog(@"Task 2 started");
    // কিছু লম্বা-running কাজ
});

এখানে, serialQueue সিরিয়াল কিউ এবং একে একে কাজগুলো এক্সিকিউট হবে। প্রথম কাজ শেষ হলে পরবর্তী কাজ শুরু হবে।

Concurrent Queue Example:

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(concurrentQueue, ^{
    NSLog(@"Task 1 started");
    // কিছু লম্বা-running কাজ
});

dispatch_async(concurrentQueue, ^{
    NSLog(@"Task 2 started");
    // কিছু লম্বা-running কাজ
});

এখানে, concurrentQueue কনকারেন্ট কিউ এবং একাধিক কাজ একসাথে এক্সিকিউট হবে। প্রথম কাজ চলমান থাকা অবস্থায় পরবর্তী কাজও শুরু হতে পারে।


3. NSOperationQueue

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

NSOperationQueue Example:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

NSOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Task 1 started");
    // কিছু লম্বা-running কাজ
}];

NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"Task 2 started");
    // কিছু লম্বা-running কাজ
}];

[queue addOperation:operation1];
[queue addOperation:operation2];

এখানে, দুটি NSBlockOperation তৈরি করা হয়েছে, এবং সেগুলিকে NSOperationQueue তে যোগ করা হয়েছে। কাজগুলো তখন কিউয়ে সিরিয়াল বা কনকারেন্টভাবে এক্সিকিউট হবে।


4. Asynchronous Tasks এবং Queues এর মধ্যে সম্পর্ক

  • Asynchronous Tasks: এগুলি কোডের এক্সিকিউশন সময়ের জন্য ইউজার ইন্টারফেস (UI) ব্লক না হওয়ার জন্য ব্যবহৃত হয়। অ্যাসিনক্রোনাস কাজগুলি বিভিন্ন থ্রেডে এক্সিকিউট হতে পারে এবং কখনো কখনো Queue তে অ্যাসাইন করা হয়।
  • Queues: কিউয়ের মাধ্যমে কাজগুলি সিরিয়ালি বা কনকারেন্টলি শিডিউল এবং এক্সিকিউট করা যায়। GCD এবং NSOperationQueue কিউ ব্যবস্থাপনা করতে ব্যবহৃত হয়, যেখানে কাজগুলো অ্যাসিনক্রোনাসভাবে রান করা হয়।

5. Memory Management with Asynchronous Tasks and Queues

  • ARC (Automatic Reference Counting): অ্যাসিনক্রোনাস কাজ বা কিউ ব্যবহার করার সময়, নিশ্চিত করতে হবে যে কিউ বা ব্লকগুলো মেমরি লিক তৈরি না করে। কিউতে যে কাজটি পাঠানো হয়, তার জন্য মেমরি ম্যানেজমেন্ট প্রয়োজন, বিশেষত যখন ব্লকগুলিকে ক্যাপচার করা হয়।
  • Weak References: কিউ বা ব্লকগুলিতে অবজেক্টের রেফারেন্স ব্যবহৃত হলে, weak রেফারেন্স ব্যবহার করা হয় যাতে রেফারেন্স কাউন্ট বৃদ্ধি না হয় এবং অবজেক্টের রেফারেন্স লিক না হয়।

Weak References in Blocks:

__weak typeof(self) weakSelf = self;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [weakSelf someMethod];  // Use weak reference to avoid retain cycle
});

এখানে weakSelf ব্যবহার করা হয়েছে যাতে retain cycle এড়ানো যায়।


6. সারাংশ

  • Asynchronous Tasks হল এমন কাজ যা ব্যাকগ্রাউন্ডে রান করতে পারে এবং মূল থ্রেড ব্লক না করে।
  • Queues বিভিন্ন কাজের জন্য ব্যবহৃত কিউ সিস্টেমের মাধ্যমে কাজগুলির সঠিক ব্যবস্থাপনা করতে সহায়তা করে। GCD এবং NSOperationQueue কিউ ব্যবস্থাপনা করতে ব্যবহৃত হয়।
  • Memory Management: অ্যাসিনক্রোনাস কাজ বা কিউ ব্যবহারের সময় মেমরি লিক এড়াতে weak references এবং ARC ব্যবহৃত হয়।
Content added By

Synchronization এবং Locking mechanisms হল multithreading প্রোগ্রামিং এর গুরুত্বপূর্ণ কনসেপ্ট, যা একাধিক থ্রেডের মধ্যে ডেটার অ্যাক্সেস এবং কনকারেন্সি (Concurrency) সঠিকভাবে নিয়ন্ত্রণ করতে ব্যবহৃত হয়। Objective-C তে সিঙ্ক্রোনাইজেশন এবং লকিং ব্যবহৃত হয় যাতে একাধিক থ্রেড একই ডেটা বা রিসোর্স অ্যাক্সেস করার সময় কোনও ধরনের কনফ্লিক্ট বা ডেটা কনসিস্টেন্সি সমস্যা না হয়।

এখানে Synchronization এবং Locking Mechanisms এর ব্যবহারিক উদাহরণ এবং তাদের কাজের বিস্তারিত আলোচনা করা হয়েছে।


1. Synchronization (সিঙ্ক্রোনাইজেশন)

Synchronization হল এমন একটি প্রক্রিয়া যা একাধিক থ্রেডের মধ্যে কনফ্লিক্ট এড়াতে ডেটার অ্যাক্সেস নিয়ন্ত্রণ করে। যখন একাধিক থ্রেড একটি কমন রিসোর্স (যেমন: ভেরিয়েবল, অ্যারে, ডিকশনারি ইত্যাদি) অ্যাক্সেস করে, তখন synchronization নিশ্চিত করে যে এক সময় শুধুমাত্র একটি থ্রেড সেই রিসোর্স অ্যাক্সেস করবে এবং অন্যথায় ডেটা কনসিস্টেন্সি সমস্যা হতে পারে।

Objective-C তে Synchronization

Objective-C তে synchronization করার জন্য @synchronized কিওয়ার্ড ব্যবহার করা হয়। এটি একটি ব্লক বা মেথডের চারপাশে থাকে এবং নিশ্চিত করে যে এক সময় শুধুমাত্র একটি থ্রেড সেই ব্লক বা মেথড এক্সিকিউট করতে পারে।

@synchronized এর সিনট্যাক্স:

@synchronized(object) {
    // Critical section
    // Only one thread can access this block at a time
}
  • object: এটি সাধারণত সেই রিসোর্সের রেফারেন্স হয় যা আপনি সিঙ্ক্রোনাইজ করতে চান (যেমন: মেম্বার ভেরিয়েবল বা অবজেক্ট)।
  • Critical section: এই কোড ব্লকে শুধু একটি থ্রেড এক্সিকিউট করতে পারবে, যখন অন্য থ্রেড একই কোড ব্লক এক্সিকিউট করার চেষ্টা করবে তখন তাকে অপেক্ষা করতে হবে।

উদাহরণ:

#import <Foundation/Foundation.h>

@interface Counter : NSObject
@property int count;
- (void) incrementCount;
@end

@implementation Counter

- (void) incrementCount {
    @synchronized(self) {  // Synchronizing access to `count`
        _count++;  // Critical section: modifying `count`
        NSLog(@"Current count: %d", _count);
    }
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Counter *counter = [[Counter alloc] init];
        
        // Multiple threads trying to increment the count
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [counter incrementCount];
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [counter incrementCount];
        });
        
        // Wait for threads to finish
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}

ব্যাখ্যা:

  • এখানে, @synchronized(self) দিয়ে count ভেরিয়েবলটির অ্যাক্সেস সিঙ্ক্রোনাইজ করা হয়েছে। অর্থাৎ, এক থ্রেড যখন incrementCount মেথড এক্সিকিউট করছে, অন্য থ্রেড সেই মেথডে প্রবেশ করতে পারবে না।
  • dispatch_async ব্যবহার করে দুটি থ্রেডের মাধ্যমে count ভেরিয়েবলটি পরিবর্তন করা হয়েছে, কিন্তু @synchronized নিশ্চিত করেছে যে এক সময় শুধুমাত্র একটি থ্রেড count ভেরিয়েবলটি অ্যাক্সেস করবে।

2. Locking Mechanisms (লকিং মেকানিজমস)

Locking হল এমন একটি প্রক্রিয়া যা একটি থ্রেডকে অন্য থ্রেডের কাজ শেষ না হওয়া পর্যন্ত একটি রিসোর্স অ্যাক্সেস করতে বাধা দেয়। Objective-C তে বেশ কয়েকটি লকিং মেকানিজম রয়েছে, যার মাধ্যমে থ্রেডের সিঙ্ক্রোনাইজেশন নিশ্চিত করা যায়। প্রধান দুটি লকিং মেকানিজম হল:

NSLock

NSLock একটি সিঙ্ক্রোনাইজেশন টুল যা থ্রেড সেফটি নিশ্চিত করার জন্য ব্যবহার করা হয়। এটি শুধুমাত্র এক থ্রেডকে একটি ক্রিটিক্যাল সেকশনে প্রবেশ করতে দেয় এবং অন্য থ্রেডকে অপেক্ষা করায় যতক্ষণ না প্রথম থ্রেড কাজটি শেষ করে।

NSLock এর ব্যবহার:
#import <Foundation/Foundation.h>

@interface Counter : NSObject
@property int count;
@property (strong) NSLock *lock;
- (void) incrementCount;
@end

@implementation Counter

- (instancetype)init {
    self = [super init];
    if (self) {
        _lock = [[NSLock alloc] init];  // Lock initialization
    }
    return self;
}

- (void) incrementCount {
    [self.lock lock];  // Lock acquired before critical section
    _count++;  // Critical section
    NSLog(@"Current count: %d", _count);
    [self.lock unlock];  // Lock released after critical section
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Counter *counter = [[Counter alloc] init];
        
        // Multiple threads trying to increment the count
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [counter incrementCount];
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [counter incrementCount];
        });
        
        // Wait for threads to finish
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}

ব্যাখ্যা:

  • NSLock ব্যবহার করা হয়েছে, যাতে এক সময় একটি থ্রেড count ভেরিয়েবলটি অ্যাক্সেস করতে পারে। থ্রেড যখন incrementCount মেথডে প্রবেশ করে, তখন এটি lock নেয় এবং কাজ শেষে unlock করে।

NSRecursiveLock

NSRecursiveLock একটি লক টাইপ যা একই থ্রেডকে বার বার একই লক করতে অনুমতি দেয়। এটি এমন পরিস্থিতিতে উপকারী, যেখানে একটি থ্রেডকে একটি ক্রিটিক্যাল সেকশনে পুনরায় প্রবেশ করতে হতে পারে।


3. Semaphore

Semaphore একটি কনকারেন্ট সিস্টেমের জন্য লকিং মেকানিজম হিসেবে কাজ করে। এটি একাধিক থ্রেডের মধ্যে একটি নির্দিষ্ট সংখ্যক রিসোর্স শেয়ার করার অনুমতি দেয়।

উদাহরণ:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);  // Semaphore with 1 resource
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);  // Wait for semaphore
            NSLog(@"First task started");
            sleep(2);  // Simulating task
            NSLog(@"First task finished");
            dispatch_semaphore_signal(semaphore);  // Signal the semaphore to allow other threads
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);  // Wait for semaphore
            NSLog(@"Second task started");
            sleep(2);  // Simulating task
            NSLog(@"Second task finished");
            dispatch_semaphore_signal(semaphore);  // Signal the semaphore to allow other threads
        });
        
        // Wait for threads to finish
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}

ব্যাখ্যা:

  • dispatch_semaphore_wait এবং dispatch_semaphore_signal ব্যবহার করে একটি সিঙ্ক্রোনাইজেশন প্রক্রিয়া তৈরি করা হয়েছে যাতে একসাথে দুটি থ্রেড একই রিসোর্স অ্যাক্সেস না করে।

সারাংশ

  • Synchronization এবং Locking মেকানিজম থ্রেডের মধ্যে ডেটা অ্যাক্সেস সিঙ্ক্রোনাইজ এবং সুরক্ষিত করার জন্য ব্যবহৃত হয়।
  • @synchronized: এটি একটি সহজ টুল যা ব্লকের ভিতরে থ্রেডের সিঙ্ক্রোনাইজেশন নিশ্চিত করে।
  • NSLock: এটি একটি ক্লাস যা থ্রেড সেফটি নিশ্চিত করতে একে একে থ্রেডগুলিকে ক্রিটিক্যাল সেকশনে প্রবেশ করতে দেয়।
  • Semaphore: এটি একটি কনকারেন্ট সিস্টেমে একাধিক থ্রেডের মধ্যে রিসোর্স শেয়ার করার জন্য ব্যবহৃত হয়।

এই সমস্ত মেকানিজম একসাথে ব্যবহার করে আমরা অ্যাসিনক্রোনাস এবং কনকারেন্ট কাজ করতে পারি, যেখানে একাধিক থ্রেড নিরাপদে কাজ করে এবং ডেটার সঠিকতা

বজায় থাকে।

Content added By

Multithreading হল একটি গুরুত্বপূর্ণ কৌশল যা অ্যাপ্লিকেশন পারফরম্যান্স উন্নত করতে সাহায্য করে, বিশেষত যখন একই সময়ে একাধিক কাজ সম্পাদন করতে হয়। তবে, ভুলভাবে ব্যবহৃত হলে এটি পারফরম্যান্সের সমস্যা সৃষ্টি করতে পারে। তাই, multithreading এর পারফরম্যান্স টিউনিং এবং সঠিকভাবে ব্যবহারের জন্য কিছু বেস্ট প্র্যাকটিস রয়েছে। এখানে আমরা Objective-C তে multithreading পারফরম্যান্স টিউনিং এবং বেস্ট প্র্যাকটিসগুলো নিয়ে আলোচনা করব।


1. Multithreading এর মৌলিক ধারণা

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

Objective-C তে multithreading এর জন্য NSThread, GCD (Grand Central Dispatch), এবং NSOperationQueue ব্যবহার করা যায়। তবে GCD সাধারণত আধুনিক অ্যাপ্লিকেশনগুলিতে সবচেয়ে বেশি ব্যবহৃত হয়।


2. Multithreading পারফরম্যান্স টিউনিং

থ্রেড ব্যবহারের মাধ্যমে অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করার জন্য কিছু গুরুত্বপূর্ণ টিউনিং কৌশল রয়েছে:

i. GCD (Grand Central Dispatch) ব্যবহার করুন

GCD হল একটি শক্তিশালী টুল যা সহজে কোড পারালাল করার জন্য ব্যবহৃত হয়। GCD queue এবং blocks এর মাধ্যমে থ্রেড ম্যানেজমেন্ট এবং টাস্ক সিঙ্ক্রোনাইজেশন সহজ করে দেয়। GCD ব্যবহারের মাধ্যমে আপনি অ্যাসিঙ্ক্রোনাস কাজ দ্রুত এবং কার্যকরভাবে করতে পারবেন।

উদাহরণ:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Background thread task
    NSLog(@"Executing task in background thread");
    
    // UI update on main thread
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"Updating UI on main thread");
    });
});
  • dispatch_async(dispatch_get_global_queue(...)): এটি ব্যাকগ্রাউন্ড থ্রেডে কাজ করবে।
  • dispatch_async(dispatch_get_main_queue(...)): এটি মেইন থ্রেডে কাজ করবে, যেমন UI আপডেট।

ii. Synchronous এবং Asynchronous কাজের মধ্যে ভারসাম্য বজায় রাখা

  • Asynchronous Tasks: Asynchronous কাজের জন্য আপনি যখন সিঙ্ক্রোনাস কাজের প্রয়োজন অনুভব করবেন না (যেমন, ব্যাকগ্রাউন্ডে একটি দীর্ঘ-running কাজ), তখন asynchronous কাজের মাধ্যমে UI Thread অবরুদ্ধ (block) হতে বাধা দেন।
  • Synchronous Tasks: যদি কাজটি গুরুত্বপূর্ণ এবং UI-তে এর প্রভাব রয়েছে, তাহলে synchronous কাজ ব্যবহার করুন যাতে কাজটি সম্পন্ন না হওয়া পর্যন্ত পরবর্তী কাজ না চলে।

iii. ব্যাকগ্রাউন্ড থ্রেডে কাজ সঠিকভাবে বিতরণ করা

অতিরিক্ত থ্রেড ব্যবহার করলে এক্সপেনডেবল পারফরম্যান্স লাভ হতে পারে, তবে এতে অতিরিক্ত থ্রেড লোড এবং কনটেক্সট সুইচিংয়ের কারণে পারফরম্যান্স কমে যেতে পারে। তাই, কাজটি সঠিকভাবে queue বা task prioritization এর মাধ্যমে বিতরণ করুন।

iv. থ্রেড সিঙ্ক্রোনাইজেশন

একাধিক থ্রেডে একই রিসোর্স বা ডেটা অ্যাক্সেস করলে সিঙ্ক্রোনাইজেশন সমস্যা দেখা দিতে পারে। সিঙ্ক্রোনাইজেশন ব্যবহারের মাধ্যমে আপনি রেস কন্ডিশন (race condition) এড়াতে পারেন এবং কোডের সঠিকতা বজায় রাখতে পারেন।

@synchronized(self) {
    // Critical section of code
    // Only one thread can access this at a time
}
  • @synchronized কিওয়ার্ডটি থ্রেড নিরাপদ কোড এক্সিকিউট করতে ব্যবহৃত হয়, যাতে একসাথে একাধিক থ্রেড একই কোড অংশে প্রবেশ করতে না পারে।

v. Thread Pooling

অতিরিক্ত থ্রেড ক্রিয়েশন কিপিং থেকে বাঁচতে, থ্রেড পুল ব্যবহার করুন। NSOperationQueue এবং GCD আপনাকে থ্রেড পুল তৈরি করতে এবং তাদের পুনঃব্যবহার করতে সাহায্য করে, যা পারফরম্যান্স উন্নত করে।


3. Best Practices for Multithreading in Objective-C

এখন আসুন, আমরা কিছু বেস্ট প্র্যাকটিস আলোচনা করি যা আপনার multithreading কোডকে আরও কার্যকরী এবং পারফরম্যান্স উন্নত করতে সাহায্য করবে।

i. GCD (Grand Central Dispatch) ব্যবহার করুন

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

ii. UI Thread এর ওপর চাপ কমান

থ্রেডিং কোডে একমাত্র UI Thread কে অবরুদ্ধ (block) করতে দেবেন না। UI Thread সবসময় প্রতিক্রিয়া (responsiveness) এবং মসৃণ ইউজার অভিজ্ঞতার জন্য ব্যবহৃত হয়, তাই ব্যাকগ্রাউন্ড থ্রেডে দীর্ঘ-running কাজ করুন।

iii. Synchronous Tasks ব্যবহার করুন UI Thread এ

যদি কোনো কাজ UI এর জন্য জরুরি হয় এবং ব্যাকগ্রাউন্ড থ্রেডে রান করানো সম্ভব না হয়, তবে সেই কাজটি synchronously চালানোর চেষ্টা করুন। এতে আপনার কোড আরও সঠিক এবং UI টাস্ক সম্পাদন করা সহজ হবে।

iv. Resource Locking এর জন্য Proper Synchronization ব্যবহার করুন

যখন একাধিক থ্রেড একই ডেটা বা রিসোর্স অ্যাক্সেস করছে, তখন সিঙ্ক্রোনাইজেশন ব্যবহার করুন। @synchronized বা NSLock ব্যবহার করে সঠিকভাবে ডেটা সুরক্ষা নিশ্চিত করুন।

v. Throttling and Task Prioritization

যখন একাধিক কাজ রান করছে, তখন এগুলোর সঠিক প্রাধান্য (priority) ঠিক করে দিন। যদি কোনো কাজ গুরুত্বপূর্ণ না হয়, তবে কম গুরুত্বের কাজগুলিকে বিলম্বিত (defer) করে রাখুন।

vi. Use NSOperationQueue for Complex Task Management

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

NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
    // Perform background task
}];
[operationQueue addOperation:operation];

vii. Avoid Over-Threading

অতিরিক্ত থ্রেড তৈরি করার পরিবর্তে, একটি থ্রেড পুল তৈরি করুন যা ইতিমধ্যে চলমান থ্রেডগুলি পুনরায় ব্যবহার করে। এতে ওভারহেড কমবে এবং সিস্টেম রিসোর্সের সঠিক ব্যবহার হবে।

viii. Perform UI Updates on the Main Thread

যখন ব্যাকগ্রাউন্ড থ্রেড থেকে UI উপাদান পরিবর্তন করা দরকার, তখন সেগুলি main thread-এ পাঠান। GCD এর মাধ্যমে এটি করা যায়:

dispatch_async(dispatch_get_main_queue(), ^{
    // UI update code here
});

4. Conclusion

  • Multithreading অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সহায়তা করে, তবে থ্রেডিং সঠিকভাবে পরিচালনা করা খুবই গুরুত্বপূর্ণ।
  • GCD এবং NSOperationQueue হল দুটি শক্তিশালী টুল যা পারফরম্যান্স টিউনিংয়ের জন্য ব্যবহৃত হতে পারে।
  • Synchronous এবং Asynchronous কাজের মধ্যে ভারসাম্য বজায় রাখুন এবং UI Thread কে অবরুদ্ধ (block) হতে বাঁধা দিন।
  • Thread Synchronization ব্যবহার করে থ্রেড নিরাপত্তা নিশ্চিত করুন এবং Thread Pooling এর মাধ্যমে অতিরিক্ত থ্রেড ক্রিয়েশন এড়ান।

এটি ছিল multithreading এর পারফরম্যান্স টিউনিং এবং বেস্ট প্র্যাকটিস নিয়ে আলোচনা।

Content added By
Promotion

Are you sure to start over?

Loading...