[英]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.