我在主线程main中create子线程1运行funsub()函数,然后又pthread_cancel线程1
其中:在funsyb函数中又开辟了个子线程2运行fun2()和fun3();fun2和fun3结构一样。
结果运行后,线程1取消掉了,但是线程2仍在运营,该怎么做让线程1取消的同时也取消线程2?
伪代码示例如下:
int main()
{
pthread_t id1,id3;
pthread_create(&id1,NULL,funsub,NULL);
pthread_create(&id3,NULL,something,NULL);
...
pthread_cancel(&id1);
pthread_join(&id1);
pthread_join(&id3);
}
void funsub()
{
pthread_t id2;
pthread_create(&id2,NULL,fun2,NULL);
fun3();
}
void fun2()
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_setcanceltype( PTHREAD_CANCEL_ASYCHRONOUS,NULL);
while(1)
{
printf("2\n");
pthread_testcancel();
}
}
无非就那么几种思路呗:
1.不要随便kill线程。
线程不要while(1)死循环,而应该while一个变量,然后外部控制这个变量,如果变成0,就自动退出线程
那么不管你后面开了多少层,退出之前记得让子线程的循环变量也变成0,那么最终都会退出
2.如果你的线程不依赖循环,而是某种阻塞机制,比如侦听,那么只能kill
此时不要随便乱开线程
子线程开的所有线程都应该先add进一个全局数组或者链表里
这样主线程在kill线程的时候才知道到底要kill哪些线程