繁体   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