怎样才能安全的结束掉子线程?
在主线程中,需要开启一个子线程用于接收网络发来的包。线程中有个循环,循环中有个recv会阻塞这个线程。
现在的情况是,如果需要在主线程中结束子线程,直接用pthread_kill会造成子线程内存泄露。怎样才能安全的结束掉子线程?
[解决办法]
最安全的是return
[解决办法]
pthread_cancel 如何?
[解决办法]
你可以在设一个共享变量,主线程中设置值false, 子线程中读这个值,如果false,while循环结束线程自动结束就行了。
[解决办法]
子线程置为joinable的状态,然后在一个while( flag )循环中处理逻辑,另一个线程设置flag之后,调用pthread_join就可以了。
[解决办法]
pthread_exit()是POSIX中提供的结束子线程的函数
但是在有锁和临界资源的情况下,什么时候可以exit,需要程序员自己来控制
[解决办法]
哥,这样的话,你应该用select或是epoll。只要recv返回0或是-1就可以退出啦。
[解决办法]
使用信号应该可以
[解决办法]
需要区分几个概念:
首先线程没有"子线程"的说法,有时大家会把执行到main函数的线程,称为主线程,这只是习惯性说法,所有的线程都是一样的,没有主次和父子关系.
另外就是工作组线程和UI线程(User Interface Thread)的区别,我最初是从MFC开始接受UI这个称呼。
从代码和语言的角度看,就是线程,不过从设计角度看,就不一样了,UI线程的设计方式,也是可以借鉴到linux上的,无非就是消息驱动罢了。
好了,现在再来说楼主的问题,我觉得你只要使用UI线程,就可以通过发消息让它安全结束掉,这样说能接受吗?
[解决办法]
设置flag的同时 关闭socket. recv就会返回了.
[解决办法]
recv()如果是阻塞的,那么就必须要有相关接口或设置可以停止recv,否则这个线程无法正常return
或者找到非阻塞的recv(),或者自己去实现recv的功能。
[解决办法]
pthread_cancel
或者用select
[解决办法]