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