ধরে নিন আমি একটি std::thread
এবং তারপরে detach()
এটি শুরু করছি , সুতরাং থ্রেডটি চালানো অব্যাহত রাখে যদিও এটি std::thread
একবার এটি উপস্থাপন করে, সুযোগের বাইরে চলে যায়।
আরও ধরে নিন যে প্রোগ্রামটির বিচ্ছিন্ন থ্রেড 1 এ যোগদানের জন্য একটি নির্ভরযোগ্য প্রোটোকল নেই , সুতরাং বিচ্ছিন্ন থ্রেডটি main()
প্রস্থান করার পরে এখনও চলে ।
আমি স্ট্যান্ডার্ডে কিছু খুঁজে পাচ্ছি না (আরও স্পষ্টভাবে, N3797 C ++ 14 খসড়াতে), যা ঘটতে হবে তা বর্ণনা করে, 1.10 বা 30.3 এর মধ্যে প্রাসঙ্গিক শব্দটি নেই।
1 আরেকটি, সম্ভবত সমতুল্য, প্রশ্ন: "কোনও বিচ্ছিন্ন থ্রেড আবার কখনও যুক্ত হতে পারে", কারণ আপনি যে প্রোটোকলে যোগদানের জন্য উদ্ভাবন করছেন, থ্রেডটি চলমান থাকাকালীন সিগন্যালিং অংশটি করতে হবে, এবং ওএস শিডিউলার হতে পারে প্রাপ্তির প্রান্তটি নির্ভরযোগ্যভাবে সনাক্ত করতে পারে যে থ্রেডটি আসলে শেষ হয়েছে কিনা তার কোনও উপায় ছাড়াই সিগন্যালিংয়ের সঞ্চালনের ঠিক পরে এক ঘন্টার জন্য থ্রেডটি ঘুমানোর সিদ্ধান্ত নিন।
যদি main()
পৃথক থ্রেডের সাথে চলমান চলমান অপরিজ্ঞাত আচরণ হয়, তবে মূল থ্রেডটি কখনই 2 থেকে বের না হওয়া অবধি কোনও ব্যবহার std::thread::detach()
অপরিজ্ঞাত আচরণ ।
সুতরাং, চলমান main()
বিচ্ছিন্ন থ্রেডগুলির সাথে দৌড়াতে অবশ্যই সংজ্ঞাযুক্ত প্রভাব থাকতে হবে। প্রশ্নটি হল: যেখানে ( সি ++ স্ট্যান্ডার্ডে , পসিক্স নয়, ওএস ডক্স নয়, ...) সেগুলি প্রভাবগুলি সংজ্ঞায়িত করা হয়েছে।
2 একটি বিচ্ছিন্ন থ্রেড যোগদান করা যাবে না (অর্থে std::thread::join()
)। আপনি পৃথক থ্রেড থেকে ফলাফলের জন্য অপেক্ষা করতে পারেন (যেমন ভবিষ্যতের মাধ্যমে std::packaged_task
, অথবা একটি গণনা সেমফোর বা পতাকা এবং শর্ত ভেরিয়েবলের মাধ্যমে), তবে এটি গ্যারান্টি দেয় না যে থ্রেডটি কার্যকর করা শেষ হয়েছে । বস্তুত, যদি না আপনি থ্রেড প্রথম স্বয়ংক্রিয় বস্তুর বিনাশকারী মধ্যে সংকেত অংশ করা, সেখানে হবে , সাধারণভাবে, কোড (destructors) যে চলবে পর সংকেত কোড। ওএস ফলাফলটি গ্রাহ্য করার জন্য মূল থ্রেডকে শিডিউল করে এবং বিচ্ছিন্ন থ্রেডটি শেষ হওয়ার আগে প্রস্থানকারীরা বলেন, কী ঘটবে?
std::exit
বা প্রস্থান করার আগে প্রতিটি থ্রেড সমাপ্তmain
করা যথেষ্ট তবে প্রয়োজনীয় নয়" " (পুরো অনুচ্ছেদটি প্রাসঙ্গিক হতে পারে) এছাড়াও দেখুন [সমর্থন.std::exit
main