خطای در استفاده مجدد از std::thread که detach شده - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

خطای در استفاده مجدد از std::thread که detach شده

+1 امتیاز

سلام خدمت دوستان.

تو فرم صلی QT به صورت زیر از std::thread استفاده کردم ولی اولین بار درست اجرا میشه دومین بار مجددا استفاده می کنم خطا میده:

class MainForm{
public:
    MainForm():
       t(nullptr){}

    std::thread* t;
    void runProc(){
         int counter = 0;
          while (country < 10000){
               //process here
           }
     }
    void run(){
          if (t){
             delete t;
          }
         t = new std::thread(&MainForm::runProc,this);
         t->detach();
     }
};

ویرایش : من detach ترد در کد یادم رفته بود

سوال شده خرداد 25, 1399  بوسیله ی AliStar (امتیاز 164)   2 20 32
ویرایش شده خرداد 25, 1399 بوسیله ی AliStar

2 پاسخ

+1 امتیاز
 
بهترین پاسخ

سلام 

کد شما درسته بجز یک مشکل کوچیک که شما باید قبل از delete کردن thread بررسی کنید که ترد joinable نباشه.تغییرات را در متد run اعمل کردم به صورت زیر :

void run(){
          if (t){
            if (t->joinable())
                  t->join();
             delete t;
          }
         t = new std::thread(&MainForm::runProc,this);
         t->detach();
     }

 

پاسخ داده شده خرداد 25, 1399 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
انتخاب شد خرداد 26, 1399 بوسیله ی AliStar
0 امتیاز

سلام؛ توی این کد که هیچ استفاده‌ای از کتابخونهٔ Qt نشده، چیش Qt هست ؟ و اینکه نیازی به اشاره‌ درست کردن از کلاس std::thread ندارید. یک متغیر ازش درست کنید و استفاده کنید:

class my_class
{
private:
    std::thread m_thread;
    std::vector<int> m_data;

public:
    my_class() = default;

    [[noreturn]] void producer()
    {
        while (true)
        {
            while (m_data.size() < std::numeric_limits<size_t>::max() / 2)
            {
                m_data.push_back(clock());
                std::this_thread::sleep_for(500ms);
            }
            std::this_thread::sleep_for(500ms);
        }
    }

    [[noreturn]] void consumer()
    {
        while (true)
        {
            while (not m_data.empty())
            {
                m_data.pop_back();
            }
        }
    }

    void run()
    {
        m_thread = std::thread(&my_class::producer, this);
        m_thread.join();
    }
};

 

پاسخ داده شده خرداد 25, 1399 بوسیله ی mg_ramezani (امتیاز 727)   1 1 12
ویرایش شده خرداد 26, 1399 بوسیله ی mg_ramezani
آره کد Qt‌نیست محض اطلاع گفتم که تو فرم Qt انجام دادم شاید اشکال در تداخل Qt و stl باشه.
نه، تداخل STL و Qt وجود نداره. صرفاً فقط نیازی نیست که شما اشاره‌گری از std::thread داشته باشید. این کلاس خودش یک اشاره‌گر از Native thread handler کتابخانهٔ مدیریت Thread سیستم‌عامل مقصد نگه‌داری می‌کنه و فقط Movable هست.
...