簡體   English   中英

主要用無限循環終止線程

[英]main terminating a thread with infinite loop

我對多線程很陌生。 以下是我嘗試運行的示例代碼。 請原諒語法錯誤(如果有的話),因為我正在記憶中。
以下代碼的問題是,它立即終止,而它應該永遠運行。 我想知道為什么即使有while (true)語句,主函數仍在調用解構函數。

沒有其他類別,因此它不是由於與其他人的互動而引起的。 主要要做的就是創建一個myclass類型的對象,並在下面調用function1()。

    int main()
    {
        myclass Object;
        Object.function1();

        return 0;
    }

    /**** new file   ******/
    typedef boost::shared_ptr<boost::thread> thread_pointer;

    class myclass
    {
    public:
        // some stuff
        void function1();
    private:
        // some stuff
        void myfunction();
        thread_pointer tr_ptr;  
    };

    ~myclass() {
        tr_ptr->join();
    }

    void myclass::function1()
    {
        // some stuff   
        tr_ptr = thread_ptr(new boost::thread(&myclass::myfunction, this));  

    }

    void myclass::myfunction()
    {
        // some stuff
        while(true){
             // some stuff
        } 
    }

在c.function1()調用中將創建第二個線程,但隨后主線程繼續運行。 但是,在聲明器中確實有thread_ptr-> join(),如果您像示例1中那樣聲明和使用myclass,則會導致無限循環(取決於系統時序),因為析構函數被稱為主出口。

主線程將在thread-> join()上阻塞,直到子線程退出。 例如,例如,當執行的主線程離開定義c的作用域時,將調用析構函數,並且主線程將調用join(),它將在其中等待子線程退出,並且由於子線程永不退出,因此主線程將永遠阻塞。

范例1:

int main(int argc,char *argv[])
{
   myclass c;

   c.function1();
}

但是,如果您這樣聲明和使用它:

范例2:

int main(int argc,char *argv[])
{
   myclass *c = new myclass();

   c->function1();
}

然后,由於必須顯式銷毀通過new創建的對象,因此將不會調用析構函數,並且由於未調用join(),程序將立即退出。

如果您進一步將其更改為:

范例3:

int main(int argc,char *argv[])
{
   myclass *c = new myclass();

   c->function1();
   delete c;
}

您再次遇到無限循環,因為再次調用析構函數將導致主線程調用join()

您的主要需求是這樣的:

int main()
{
    myclass Object;
    Object.function1();

    while(true){
    }
    // Or wait for a join by the thread...

    return 0;
}

之所以調用對象的析構函數,是因為當main終止時,該Object將超出范圍。

線程的壽命與其調用過程相關

當進程退出/終止時,它的所有線程也都這樣做。 一種確保進程不會終止的快速方法是在創建線程后添加while(true)循環。

如您的注釋中所述,您希望將“ while”循環“封裝”在類中。 您可以像這樣在function1()添加它:

void myclass::function1()
{
    // some stuff   
    tr_ptr = thread_ptr(new boost::thread(&myclass::myfunction, this));  

    while(true){
        // Do something
    } 

}

但是,它將“阻塞”您的主線程,首先失去了實現線程的大多數優勢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM