মাল্টিথ্রেডিং সিঙ্ক্রোনাইজেশন সাক্ষাত্কারের প্রশ্ন: এম থ্রেড দেওয়া n শব্দগুলি সন্ধান করুন


23

একক থ্রেডের পরিবর্তে একাধিক থ্রেড সহ সমাধান থেকে এই সমস্যাটি উপকৃত হতে পারে?


একটি সাক্ষাত্কারে, আমাকে একাধিক থ্রেড ব্যবহার করে একটি সমস্যার সমাধান করতে বলা হয়েছিল। আমার কাছে মনে হচ্ছে একাধিক থ্রেড কোনও লাভ দেয় না।

সমস্যাটি এখানে:

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

আমি দৃ strongly়ভাবে অনুভব করি যে আমরা এখানে থ্রেডগুলির কোনও সুবিধা নিতে পারি না, তবে বিশ্বাস করি সাক্ষাত্কারটি আমার সিঙ্ক্রোনাইজেশন দক্ষতা পরিমাপ করার চেষ্টা করছে। আমি কি এই সমস্যায় এমন কিছু মিস করছি যা একাধিক থ্রেডের মূল্য তৈরি করবে?

কোডের দরকার নেই, কিছু চিন্তাভাবনা করুন। আমি নিজেই বাস্তবায়ন করব।


একটি সি ++ ট্যাগ যুক্ত করা এখানে সম্ভবত খুব বেশি সহায়তা করবে না। এই চারপাশে এই প্রশ্নগুলি আরও ধারণাগত উপাদান যা কোনও নির্দিষ্ট ভাষার চেয়ে বেশি।
সিএওও

আপনার অনুভূতি বিশ্বাস করুন। আমি বুঝতে পারি যে তারা কী জন্য যাচ্ছেন তবে আমি কখনও সাক্ষাত্কারের প্রশ্ন পছন্দ করি না যা আপনাকে বাস্তব বিশ্বে কীভাবে সমস্যার সমাধান করা উচিত তা থেকে দূরে সরিয়ে দেয়।
G_P

16
@ আরপ্লাস্গ - আমি একজন মধ্যস্থতাকারী দ্বারা আরও বেশি মুগ্ধ হব যিনি বলেছিলেন যে সমাধানটি সমস্যার ক্রিয়াকলাপ তৈরি করে এবং কেবল কোনও সহজাত প্রসেসিং না করে কেবল থ্রেড ওভারহেড যুক্ত করে। সাক্ষাত্কারকারী আপনাকে জিজ্ঞাসা করা প্রশ্নের উত্তরটি সর্বদা জোর করতে পারে।
ডেভিড হার্কনেস

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

1
আমি এটি @ ব্লগার পেয়েছি। এটি এমন এক ধরণের যাবতীয় যাচাই করতে হবে যা আপনি কীভাবে এক্স এক্স ব্যবহার করবেন তা জানেন তবে খুব অলস বা আলগা ছিলেন এমন একটি খাঁটি অ্যাপ্লিকেশন ব্যবহারের ক্ষেত্রে দৃশ্যের নকশা তৈরি করতে যা সত্যই সেই সরঞ্জামটির ব্যবহারের জন্য সতর্ক করে দেয় তাই আমি কেবল হাতে প্রথম যা পেয়েছিলাম তা ধরলাম এবং আমার উদাহরণটি কবুল করালাম এটি opালুভাবে। সত্যই, যদি আমাকে একটি সাক্ষাত্কারে জিজ্ঞাসা করা হয়, আমি তাকে এটির কল করব এবং সম্ভবত এর মতো ঝাঁঝালো এবং অর্ধেকের কারও সাথে কাজ করতে চাই না
উভচর

উত্তর:


22

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

মূলত, আপনি msemaphores তৈরি করবে । প্রতিটি থ্রেড xsemaphore এর জন্য অপেক্ষা করে তার কাজ xকরার x+1পরে semaphore এ পোস্ট করে । সিউডোকোডে:

loop:
    wait(semaphore[x])
    if no more words:
        post(semaphore[(x+1) % m])
        exit
    print word
    increment current word pointer
    post(semaphore[(x+1) % m])

অনুগ্রহ করার জন্য ধন্যবাদ আমাকে কিছুটা সময় নিয়েছিল তা বোঝার জন্য যে এটির উপর চলাফেরা করছে কে বলবে।
কেডিগ্রিগরি

আমার অজ্ঞতাটি ক্ষমা করুন, কীভাবে এই সমাধানটি সঠিক? এটি কি কিছু নতুন অভিনব ধরণের সেমোফোর? তবে আমি নিশ্চিত যে প্রশ্নটি অপেক্ষা / বিজ্ঞপ্তিযুক্ত সমাধানের মাধ্যমে সমাধান করা হয়েছে [যা সেমোফোরগুলি ব্যবহার করে]।
এজেদ

এটি স্ট্যান্ডার্ড semaphores এর একটি অ্যারে। তাদের সম্পর্কে বিশেষ কিছু নেই। কিছু বাস্তবায়নে বিজ্ঞপ্তিকে "পোস্ট" বলা হয়।
কার্ল বিলেফেল্ট

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

এটি প্রতিটি থ্রেডের জন্য লুপটি প্রদর্শন করছে। জিনিসগুলি সরিয়ে দেওয়ার জন্য সেটআপ কোডটিতে প্রথম সেমোফোরে পোস্ট করতে হবে।
কার্ল বিলেফেল্ট 18

23

আমার মতে এটি একটি চমত্কার সাক্ষাত্কারের প্রশ্ন - কমপক্ষে ধরে নেওয়া (1) প্রার্থীর থ্রেডিংয়ের গভীর জ্ঞান থাকার প্রত্যাশা রয়েছে এবং (২) সাক্ষাত্কারকারীরও গভীর জ্ঞান রয়েছে এবং প্রার্থীকে তদন্ত করার জন্য প্রশ্নটি ব্যবহার করছেন। এটি সর্বদাই সম্ভব যে সাক্ষাত্কারকারীর একটি নির্দিষ্ট, সংকীর্ণ উত্তর খুঁজছিলেন, তবে একজন দক্ষ সাক্ষাত্কারকারীর নিম্নলিখিত সন্ধান করা উচিত:

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

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

এটি মাথায় রেখে, আমার পদ্ধতির প্রতি থ্রেডকে দুটি সারি দেওয়া হবে: একটি ইনপুট, একটি আউটপুট। ইনপুট সারিটি পড়ার সময় থ্রেডটি ব্লক করে, প্রথম শব্দটি স্ট্রিংয়ের বাইরে নিয়ে যায় এবং স্ট্রিংয়ের বাকী অংশটিকে তার আউটপুট কাতারে পাস করে। এই পদ্ধতির কয়েকটি বৈশিষ্ট্য:

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

এটি বলেছিল, এখনও অনেক ধূসর অঞ্চল রয়েছে যা একটি উপযুক্ত সাক্ষাত্কারকারীর তদন্ত করতে পারে:

  • "ঠিক আছে, তবে আমরা আপনার সমঝোতা আদিম সম্পর্কে জ্ঞানটি খুঁজছি; আপনি কি একটি ব্লকিং সারিটি প্রয়োগ করতে পারবেন?" অবশ্যই আপনার প্রথম উত্তরটি এমন হওয়া উচিত যা আপনি নিজের পছন্দের প্ল্যাটফর্ম থেকে প্রাক-বিল্ট ব্লকিং সারিটি ব্যবহার করেন। তবে, যদি আপনি থ্রেডগুলি বুঝতে পারেন তবে আপনি আপনার প্ল্যাটফর্মটি যে সিঙ্ক্রোনাইজেশন সমর্থন করে তা আদিম ব্যবহার করে এক ডজন লাইনের কোডের অধীনে একটি সারি বাস্তবায়ন তৈরি করতে পারেন।
  • "যদি প্রক্রিয়াটির একটি পদক্ষেপ খুব দীর্ঘ সময় নেয়?" আপনি যদি সীমাবদ্ধ বা আনবাউন্ডেড আউটপুট সারি চান, আপনি কীভাবে ত্রুটিগুলি পরিচালনা করতে পারেন এবং আপনার যদি দেরি হয় তবে সামগ্রিক থ্রুপুটগুলিতে কী কী প্রভাব পড়তে হবে সে সম্পর্কে আপনার ভাবনা উচিত।
  • কীভাবে দক্ষতার সাথে উত্সের স্ট্রিংটিকে সারিবদ্ধ করা যায়। অবিচ্ছিন্নভাবে যদি আপনি মেমরির সারিগুলি নিয়ে কাজ করে থাকেন তবে সমস্যা নয়, আপনি যদি মেশিনগুলির মধ্যে চলে যান তবে সমস্যা হতে পারে। আপনি অন্তর্নিহিত অপরিবর্তনীয় বাইট অ্যারের শীর্ষে কেবল পঠনযোগ্য মোড়কের অন্বেষণ করতে পারেন।

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


প্রসেসরের এল 1 ক্যাশে সম্পর্কে পুরো নোটটি আমাকে সত্যিই আগ্রহী করেছিল। ভোট দিয়েছেন।
মার্ক ডিমিলো

আমি সম্প্রতি স্প্রিং 5 এর সাথে প্রজেক্টরে্যাক্টর ব্যবহার করেছি যা আমাকে থ্রেড অজ্ঞোস্টিক কোড লেখার অনুমতি দেয়।
কুন্ডন বোরা

16

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

"কেবল উত্তর দেওয়ার চেষ্টা করুন, এবং সেখান থেকে বের হয়ে আসুন .."

এই চিন্তার ধরণটির সাথে সাক্ষাত্কারে পৌঁছানো আপনাকে যে কোনও সংস্থার পক্ষে কাজ করার উপযুক্ত কোনও সাক্ষাত্কারে বোমা ফেলার দিকে পরিচালিত করবে।

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


3
আমি এই উত্তরটিকে কমিয়ে দিয়েছি (যদিও তা অনিবার্যভাবে 4 টি উর্ধ্বতন পেয়েছে), কারণ এটি যে প্রশ্ন করা হয়েছিল তার উত্তর দেয় না।
রবার্ট হার্ভে

1
@ রবার্টহারভে: কখনও কখনও লোকেরা ভুল প্রশ্ন জিজ্ঞাসা করে । প্রযুক্তিগত সাক্ষাত্কারগুলি মোকাবেলা করার জন্য ওপির একটি দুর্বল মানসিকতা রয়েছে এবং এই উত্তরটি তাকে / তাকে সঠিক পথে রাখার জন্য সহায়তা করার চেষ্টা ছিল।
ডেমিয়ান ব্রাচেট

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

@ রবার্টহার্ভে এটি সম্পর্কিত সম্পর্কিত প্রশ্নের উত্তর দেয়, নিচে ভোটদান কোনও কিছুই সফল করতে পারেনি।
মার্ক ডিমিলো

0
  • প্রথমে যথাযথ ডিলিমিটারগুলির সাথে অনুচ্ছেদে টোকেনাইজ করুন এবং শব্দগুলিকে একটি সারিতে যুক্ত করুন।

  • এন সংখ্যার থ্রেড তৈরি করুন এবং এটি একটি থ্রেড পুলে রাখুন।

  • থ্রেড পুলের উপরে ইটারেট করুন এবং থ্রেডটি শুরু করুন এবং
    থ্রেডটি যুক্ত হওয়ার জন্য অপেক্ষা করুন । প্রথম থ্রেড শেষ হয়ে গেলে এবং পরবর্তী থ্রেডটি শুরু করুন।

  • প্রতিটি থ্রেডের কেবল সারিটি পোল করা উচিত এবং এটি মুদ্রণ করা উচিত।

  • সমস্ত থ্রেড একবার থ্রেড পুলের মধ্যে ব্যবহার করা হলে পুলের শুরু থেকে শুরু করুন।


0

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

তবে, আমার উত্তরটি হ'ল অ্যারে সূচক শব্দের অ্যাক্সেসকে নিয়ন্ত্রণ করে এমন একটি লক অ্যাক্সেস করার চেষ্টা করে প্রতিটি থ্রেড একটি শক্ত লুপে রাখা হবে। প্রতিটি থ্রেড লকটি ধরে, সূচকটি পায়, অ্যারে থেকে অনুরূপ শব্দ পায়, এটি মুদ্রণ করে, সূচকে বৃদ্ধি করে তারপরে লকটি প্রকাশ করে। সূচকের অ্যারের শেষে থাকা অবস্থায় থ্রেডগুলি প্রস্থান করে।

এটার মতো কিছু:

while(true)
{
    lock(index)
    {
        if(index >= array.length())
          break;
        Console.WriteLine(array[index]);
        index++;
    }
}

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


-1

এই সমস্যাটি সমাধান করতে শর্ত অপেক্ষা / সিগন্যাল এপিআই ব্যবহার করুন।

যাক প্রথম থ্রেডটি 1 টি শব্দ চয়ন করে এবং ইতিমধ্যে বিশ্রামে সমস্ত থ্রেড একটি সংকেতের জন্য অপেক্ষা করছে। 1 ম থ্রেড প্রথম শব্দ মুদ্রণ করে এবং পরবর্তী থ্রেডে সিগন্যাল উত্পন্ন করে এবং দ্বিতীয় থ্রেড দ্বিতীয় শব্দটি মুদ্রণ করে এবং তৃতীয় থ্রেডে সংকেত উত্পন্ন করে on

#include <iostream>
#include <fstream>
#include <pthread.h>
#include <signal.h>
pthread_cond_t cond[5] = {PTHREAD_COND_INITIALIZER,};
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

using namespace std;

string gstr;

void* thread1(void*)
{
    do {
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond[0],&mutex);
    cout <<"thread1 :"<<gstr<<endl;
    pthread_mutex_unlock(&mutex);
    }while(1);
}

void* thread2(void*)
{
    do{
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond[1],&mutex);
    cout <<"thread2 :"<<gstr<<endl;
    pthread_mutex_unlock(&mutex);
    }while(1);
}

void* thread3(void*)
{
    do{
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond[2],&mutex);
    cout <<"thread3 :"<<gstr<<endl;
    pthread_mutex_unlock(&mutex);
    }while(1);
}

void* thread4(void*)
{
    do{
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond[3],&mutex);
    cout <<"thread4 :"<<gstr<<endl;
    pthread_mutex_unlock(&mutex);
    }while(1);
}

void* thread5(void*)
{
    do{
    pthread_mutex_lock(&mutex);
    pthread_cond_wait(&cond[4],&mutex);
    cout <<"thread5 :"<<gstr<<endl;
    pthread_mutex_unlock(&mutex);
    }while(1);
}

int main()
{
    pthread_t t[5];
    void* (*fun[5])(void*);
    fun[0]=thread1;
    fun[1]=thread2;
    fun[2]=thread3;
    fun[3]=thread4;
    fun[4]=thread5;

    for (int i =0 ; i < 5; ++i)
    {
        pthread_create(&t[i],NULL,fun[i],NULL);
    }
    ifstream in;
    in.open("paragraph.txt");
    int i=0;
    while(in >> gstr)
    {

        pthread_cond_signal(&cond[i++]);
        if(i == 5)
            i=0;
        usleep(10);
    }
    for (int i =0 ; i < 5; ++i)
    {
        int ret = pthread_cancel(t[i]);
        if(ret != 0)
            perror("pthread_cancel:");
        else
            cout <<"canceled\n";
    }
    pthread_exit(NULL);
}

-1

[এখানে পসিক্স থ্রেডগুলির সাথে নির্দিষ্ট শর্তাদি ব্যবহার করা হয়েছে]

এই সমস্যাটি সমাধান করার জন্য একটি ফিফো মিটেক্স ব্যবহার করাও উচিত।

কোথায় ব্যবহার করবেন:

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

এটি কীভাবে কাজ করে / কীভাবে বাস্তবায়ন করতে পারে:

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

লক অপারেশন:

node = get_thread_specific_data(node_key);
lock(mutex);
    if(!owned)
    {
        owned = true;
        owner = self;
        return success;
    }

    node->next = nullptr;
    if(waiters_queue == null) waiters_queue = node;
    else waiters_last->next = node;

    waiters_last = node;
unlock(mutex);
sem_wait(node->semaphore);

lock(mutex);
    if(owned != -1) abort();
    owned = true;
    owner = self;
    waiters_queue = waiters_queue->next;
 unlock(mutex);

আনলক অপারেশন:

lock(mutex);
    owner = null;
    if(waiters_queue == null)
    {
        owned = false;
        return success;
    }
    owned = -1;
    sem_post(waiters_queue->semaphore);
unlock(mutex);

-1

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

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import java.util.concurrent.SynchronousQueue;

public class FindNWordsGivenMThreads {

    private static final int NUMBER_OF_WORDS = 100;
    private static final int NUMBER_OF_THREADS = 5;
    private static final Stack<String> POISON_PILL = new Stack<String>();

    public static void main(String[] args) throws Exception {
        new FindNWordsGivenMThreads().run();
    }

    private void run() throws Exception {
        final Stack<String> words = loadWords();
        SynchronousQueue<Stack<String>> init = new SynchronousQueue<Stack<String>>();
        createProcessors(init);
        init.put(words);
    }

    private void createProcessors(SynchronousQueue<Stack<String>> init) {
        List<Processor> processors = new ArrayList<Processor>();

        for (int i = 0; i < NUMBER_OF_THREADS; i++) {

            SynchronousQueue in;
            SynchronousQueue out;

            if (i == 0) {
                in = init;
            } else {
                in = processors.get(i - 1).getOut();
            }

            if (i == (NUMBER_OF_THREADS - 1)) {
                out = init;
            } else {
                out = new SynchronousQueue();
            }

            Processor processor = new Processor("Thread-" + i, in, out);
            processors.add(processor);
            processor.start();

        }

    }

    class Processor extends Thread {

        private SynchronousQueue<Stack<String>> in;
        private SynchronousQueue<Stack<String>> out;

        Processor(String name, SynchronousQueue in, SynchronousQueue out) {
            super(name);
            this.in = in;
            this.out = out;
        }

        @Override
        public void run() {

            while (true) {

                Stack<String> stack = null;
                try {
                    stack = in.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                if (stack.empty() || stack == POISON_PILL) {
                    System.out.println(Thread.currentThread().getName() + " Done!");
                    out.offer(POISON_PILL);
                    break;
                }

                System.out.println(Thread.currentThread().getName() + " " + stack.pop());
                out.offer(stack);
            }
        }

        public SynchronousQueue getOut() {
            return out;
        }
    }

    private Stack<String> loadWords() throws Exception {

        Stack<String> words = new Stack<String>();

        BufferedReader reader = new BufferedReader(new FileReader(new File("/usr/share/dict/words")));
        String line;
        while ((line = reader.readLine()) != null) {
            words.push(line);
            if (words.size() == NUMBER_OF_WORDS) {
                break;
            }
        }
        return words;
    }
}

-2

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

তারপরে আমি তাদেরকে হয় থ্রেডিংয়ের বিষয়ে একটি সত্যিকারের বিশ্ব প্রশ্ন দিতে বা কিছু গুরুতর থ্রেডিংয়ের বাস্তব জগতের উদাহরণ দিতে বলি।

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