linux 和 windows C++ 子线程编程中子线程的退出——总结

去年用MFC写了一个项目,需要给多个串口开多个子线程,而且用户可能随时关闭串口端口,考虑用线程池来解决,规避经常开关子线程的问题。但是当应用程序退出时,总归还是要关闭所有的子线程,所以还是要面临如何解决从子线程外部关闭子线程的问题。

因为之前只接触过Linux的系统编程和网络编程,纯C语言的编程,很直接的去用pthread_cancel函数,搭配pthread_cleanup_push和pthread_cleanup_pop入栈线程清理函数,完成子线程的资源回收。

然后一直在MSDN中找类似的函数,从线程外面结束子线程,但是没有找到,一般的解决办法都是主线程SetEvent,然后子线程监控该事件,事件发生子线程调用AfxEndThread函数退出。

现在工作中,解决蓝牙串口的子线程的结束问题,平台时android,我又想当然的想到pthread_cancel,毫无疑问啊,因为android用的是linux内核,肯定有这个函数。分分钟写完了整个实现,然后编译说,pthread_cancel is not declared,我草,怎么又没有这个函数。去源码库中找头文件,发现真的没有这个函数的声明,其他pthread函数族都有。

恍然大悟,原来C++中不允许一个子线程被突然中断杀死,因为这样会导致资源很难回收。网上搜索后,也是这样的解答。OK,明白了,这条路就算绝了!

那么借用上面的思维,新建一个管道,子线程监控管道数据,主线程向管道写数据,即可触发子线程结束。

详见:http://blog.csdn.net/luoyouren/article/details/44939143

你可能感兴趣的:(linux 和 windows C++ 子线程编程中子线程的退出——总结)