"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف تكتشف بشكل فعال ما إذا كان `std :: thread` لا يزال يعمل في c ++؟

كيف تكتشف بشكل فعال ما إذا كان `std :: thread` لا يزال يعمل في c ++؟

نشر في 2025-05-03
تصفح:329

How to Effectively Check if a `std::thread` is Still Running in C  ?

كيفية التحقق مما إذا كان مؤشر ترابط std :: لا يزال قيد التشغيل (cross-platform)

عند العمل مع Thind :: ، من الأهمية بمكان مراقبة حالة التنفيذ لإدارة مؤشر ترابط فعالة. ومع ذلك ، فإن طريقة coinable () غير مصممة لتحديد ما إذا كان مؤشر ترابط لا يزال قيد التشغيل. بدلاً من ذلك ، تعرض هذه المقالة العديد من الأساليب المستقلة للمنصة لمعالجة هذه الحاجة. مع STD :: Future :: Wait_for (0ms) ، يمكنك التحقق من حالة الموضوع عن طريق فحص قيمة الحالة التي تم إرجاعها:

#include int main () { Auto Future = Std :: Async (Std :: Launch :: Async ، [] { std :: this_thread :: sleep_for (3s) ؛ العودة 8 ؛ }) ؛ // تحقق من حالة الموضوع Auto status = future.wait_for (0ms) ؛ if (الحالة == std :: future_status :: جاهزة) { std :: cout

باستخدام std :: الوعد (مع std :: thread)

#include 
#include 

int main() {
  auto future = std::async(std::launch::async, [] {
    std::this_thread::sleep_for(3s);
    return 8;
  });

  // Check thread status
  auto status = future.wait_for(0ms);
  if (status == std::future_status::ready) {
    std::cout  {
    std :: this_thread :: sleep_for (3s) ؛
    p.set_value (true) ؛
  }) ؛

  // تحقق من حالة الموضوع
  Auto status = future.wait_for (0ms) ؛
  if (الحالة == std :: future_status :: جاهزة) {
    std :: cout  

باستخدام std :: atomic مع std :: thread

نهج مباشر لـ C 11 وما بعده هو الاستفادة #include int main () { std :: Atomic تم (false) ؛ std :: thread t (
#include 
#include 

int main() {
  std::promise p;
  auto future = p.get_future();

  std::thread t([&p] {
    std::this_thread::sleep_for(3s);
    p.set_value(true);
  });

  // Check thread status
  auto status = future.wait_for(0ms);
  if (status == std::future_status::ready) {
    std::cout  

باستخدام std :: packaged_task (مع std :: thread)

#include int main () { std :: packaged_task Task ([] { std :: this_thread :: sleep_for (3s) ؛ }) ؛ Auto Future = task.get_future () ؛ std :: thread t (std :: move (task)) ؛ // تحقق من حالة الموضوع Auto status = future.wait_for (0ms) ؛ if (الحالة == std :: future_status :: جاهزة) { // ... } t.join () ؛ }

#include 
#include 

int main() {
  std::atomic done(false);

  std::thread t([&done] {
    std::this_thread::sleep_for(3s);
    done = true;
  });

  // Check thread status
  if (done) {
    std::cout 
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3