এটি এই প্রশ্নের সাথে শিথিলভাবে সম্পর্কিত: এসটিডি :: থ্রেডটি কি সি ++ 11 তে পুল করা হয়? । যদিও প্রশ্নটি পৃথক, উদ্দেশ্য একই:
প্রশ্ন 1: ব্যয়বহুল থ্রেড সৃষ্টি এড়াতে এখনও নিজের (বা তৃতীয় পক্ষের লাইব্রেরি) থ্রেড পুলগুলি ব্যবহার করা কি বোধগম্য?
অন্যান্য প্রশ্নের উপসংহারটি হ'ল আপনি std::thread
পুল করার উপর নির্ভর করতে পারবেন না (এটি হতে পারে বা এটি হতে পারে না)। তবে std::async(launch::async)
মনে হচ্ছে পুলে যাওয়ার অনেক বেশি সুযোগ রয়েছে।
এটি মনে হয় না যে এটি স্ট্যান্ডার্ড দ্বারা বাধ্য করা হয়েছে, তবে আইএমএইচওও আমি আশা করব যে থ্রেড তৈরির কাজটি ধীর গতিতে থাকলে সমস্ত ভাল সি ++ 11 বাস্তবায়ন থ্রেড পুলিং ব্যবহার করবে। কেবল এমন প্ল্যাটফর্মগুলিতে যেখানে একটি নতুন থ্রেড তৈরি করা কম ব্যয়বহুল, আমি প্রত্যাশা করব যে তারা সর্বদা একটি নতুন থ্রেড তৈরি করে।
প্রশ্ন 2: এটি আমি যা মনে করি ঠিক এটি তবে এটি প্রমাণ করার মতো আমার কাছে কোনও তথ্য নেই। আমি খুব ভাল ভুল হতে পারে। এটা কি শিক্ষিত অনুমান?
অবশেষে, আমি এখানে কিছু নমুনা কোড সরবরাহ করেছি যা প্রথম দেখায় যে আমি কীভাবে থ্রেড তৈরির দ্বারা প্রকাশ করতে পারি বলে মনে করি async(launch::async)
:
উদাহরণ 1:
thread t([]{ f(); });
// ...
t.join();
হয়ে
auto future = async(launch::async, []{ f(); });
// ...
future.wait();
উদাহরণ 2: আগুন এবং থ্রেড ভুলে যান
thread([]{ f(); }).detach();
হয়ে
// a bit clumsy...
auto dummy = async(launch::async, []{ f(); });
// ... but I hope soon it can be simplified to
async(launch::async, []{ f(); });
প্রশ্ন 3: আপনি async
সংস্করণ সংস্করণ পছন্দ করবেন thread
?
বাকিগুলি এখন আর প্রশ্নের অংশ নয়, তবে কেবল স্পষ্ট করার জন্য:
ফেরতের মানটি একটি ডামি ভেরিয়েবলের জন্য কেন বরাদ্দ করা উচিত?
দুর্ভাগ্যক্রমে, বর্তমান সি ++ 11 স্ট্যান্ডার্ড বাহিনী std::async
যেগুলির আপনি ফেরতের মানটি ক্যাপচার করেন , অন্যথায় ধ্বংসকারী কার্যকর করা হয়, যা ক্রিয়া শেষ না হওয়া অবধি অবরুদ্ধ করে। এটি কিছুকে স্ট্যান্ডার্ডের একটি ত্রুটি হিসাবে বিবেচনা করা হয় (উদাঃ, হার্ব সাটার দ্বারা)।
Cppreferences.com এর এই উদাহরণটি এটিকে সুন্দরভাবে ফুটিয়ে তুলেছে :
{
std::async(std::launch::async, []{ f(); });
std::async(std::launch::async, []{ g(); }); // does not run until f() completes
}
আরেকটি ব্যাখ্যা:
আমি জানি যে থ্রেড পুলগুলির অন্যান্য বৈধ ব্যবহার থাকতে পারে তবে এই প্রশ্নে আমি ব্যয়বহুল থ্রেড তৈরির ব্যয় এড়াতে কেবল আগ্রহী ।
আমি মনে করি এখনও এমন পরিস্থিতি রয়েছে যেখানে থ্রেড পুলগুলি খুব কার্যকর, বিশেষত যদি আপনার সংস্থানগুলির উপর আরও নিয়ন্ত্রণের প্রয়োজন হয়। উদাহরণস্বরূপ, কোনও সার্ভার দ্রুত প্রতিক্রিয়া বারের গ্যারান্টি দিতে এবং মেমরির ব্যবহারের পূর্বাভাসযোগ্যতা বাড়াতে কেবলমাত্র একটি নির্দিষ্ট সংখ্যক অনুরোধগুলি হ্যান্ডেল করার সিদ্ধান্ত নিতে পারে। থ্রেড পুলগুলি এখানে ঠিক আছে।
থ্রেড-স্থানীয় ভেরিয়েবলগুলি আপনার নিজস্ব থ্রেড পুলগুলির পক্ষেও একটি যুক্তি হতে পারে, তবে এটি অনুশীলনে প্রাসঙ্গিক কিনা তা আমি নিশ্চিত নই:
std::thread
প্রারম্ভিক থ্রেড-স্থানীয় ভেরিয়েবলগুলি ছাড়াই শুরু করে একটি নতুন থ্রেড তৈরি করা । সম্ভবত এটি আপনি চান না।- থ্রেডগুলি দ্বারা প্রসারিত
async
, এটি আমার পক্ষে কিছুটা অস্পষ্ট কারণ থ্রেডটি পুনরায় ব্যবহার করা যেতে পারে। আমার উপলব্ধি থেকে, থ্রেড-স্থানীয় ভেরিয়েবলগুলি পুনরায় সেট করার গ্যারান্টি নেই তবে আমার ভুল হতে পারে। - অন্যদিকে আপনার নিজের (স্থির-আকারের) থ্রেড পুলগুলি ব্যবহার করা আপনাকে যদি সত্যই এটির প্রয়োজন হয় তবে আপনাকে সম্পূর্ণ নিয়ন্ত্রণ দেয়।
std::async()
। তারা এখনও থ্রেড পুলে অ-তুচ্ছ থ্রেড_লোকাল ডেস্ট্রাক্টরকে কীভাবে সমর্থন করে তা দেখতে আমি এখনও আগ্রহী।
launch::async
থাকলে এটি কেবল এটির মতো আচরণ করে launch::deferred
এবং কখনই এটি অযৌক্তিকভাবে কার্যকর করে না - ফলস্বরূপ, libstdc এর সংস্করণ ++ "চয়ন করে" অন্যথায় বাধ্য না করা হলে সর্বদা পিছিয়ে থাকা ব্যবহার করতে।
std::async
পারফরম্যান্সের জন্য একটি সুন্দর জিনিস হতে পারে - এটি স্ট্যান্ডার্ড পুলের সাহায্যে স্বাভাবিকভাবে সমর্থিত স্ট্যান্ডার্ড শর্ট-রানিং-টাস্ক এক্সিকিউশন সিস্টেম হতে পারে। এই মুহুর্তে, std::thread
থ্রেড ফাংশনটি কোনও মান ফেরত দিতে সক্ষম করতে এটি কিছু ক্রেপ সঙ্গে সজ্জিত। ওহ, এবং তারা রিডানড্যান্ট "মুলতুবি" কার্যকারিতা যুক্ত করেছে যা std::function
পুরোপুরিভাবে কাজকে ওভারল্যাপ করে ।
std::async(launch::async)
মনে হচ্ছে পুলে যাওয়ার অনেক বেশি সুযোগ রয়েছে।" না, আমি বিশ্বাস করি এটিstd::async(launch::async | launch::deferred)
পুলে যেতে পারে।launch::async
অন্যান্য কাজগুলি যা চলছে তা নির্ধারণ না করে সবেমাত্র একটি নতুন থ্রেডে টাস্কটি চালু করার কথা রয়েছে। নীতিটি নিয়েlaunch::async | launch::deferred
তারপরে বাস্তবায়নটি কোন নীতিটি চয়ন করতে পারে, তবে আরও গুরুত্বপূর্ণটি হ'ল কোন নীতিটি বেছে নিতে বিলম্ব হয়। এটি, থ্রেড পুলে একটি থ্রেড উপলব্ধ না হওয়া পর্যন্ত এটি অপেক্ষা করতে পারে এবং তারপরে অ্যাসিঙ্ক নীতিটি চয়ন করতে পারে।