正确退出线程
背景
最近发现以前工作中写的代码有个比较严重的bug,在这里做一下笔记,并做适当扩展,防止以后出现类似的问题。
问题背景是这样的,有一个管理设备用的进程需要从远端FTP服务器上下载软件包,以执行升级操作。管理进程通过select监听socket文件描述符,有消息到来时就调用对应的消息处理函数处理消息。执行从FTP服务器上下载软件包的操作,就是为了响应软件下载消息。在这种框架下,肯定是不能直接在消息处理函数中执行下载任务的,因为这可能导致管理进程阻塞,无法响应其他消息,因此想到重新启动一个线程来执行下载任务。
功能实现非常简单,收到软件下载消息后,在消息处理函数中启动一个线程执行下载任务,线程创建成功后,消息处理函数返回,继续等待下一条消息,并不会等待下载线程结束。由于看Linux系统编程时囫囵吞枣,导致学艺不精,天真地以为下载线程能不留痕迹的安全退出。实际情况却是,默认创建的线程是非分离态的(joinable),这种情况下,父线程需要调用pthread_join来等待子线程结束,只有当pthread_join返回时,子线程才会真正结束,才会释放占用的系统资源。如果想要线程结束后,立即释放占用的系统资源,需要设置线程为分离线程(detached)。
创建分离线程
有两种方法可以设置线程为分离线程,分别是创建时设置线程属性和调用pthread_detach.下面分别来介绍这两种方法。
设置线程属性
创建线程时,可以通过pthread_create的第二个参数传递线程属性。