我正在编写一个多线程服务器程序,该程序回显客户端发送的数据。我每个客户端产生一个线程。在线程的启动例程中,我正在接收客户端的数据并将其回显。
如果客户端断开连接,那么我使用pthread_detach(pthread_self())
将该线程设置为分离,这样在退出时,线程的存储可以回收为given here。
所以我想问一下:
1)单独分离线程是否正确?
2)在程序中的任何地方将线程设置为分离(单独)是正确的,即在创建线程之后或之时是否没有必要这样做?
P.S。:我的程序工作正常,但是因为在多线程程序中,即使存在错误,它们最初也可能不会出现,所以我想清除这两个问题。
答案 0 :(得分:2)
每个线程必须加入或分离,并且每个成功启动的线程必须恰好其中一个必须发生。你如何以及何时这样做完全取决于你。
问题2没有多大意义:线程只在执行时执行(重复),并且只能在执行时调用函数。因此,一个线程可以在运行时自行分离,但当然不会在之后(因为它不再运行)。
答案 1 :(得分:1)
单独分离线程没有问题,但应该注意线程是否正确分离,并且在分离线程后没有人可以访问它。销毁获取thread::id
的对象线程,以便在分离线程后没有变量可以持久存在并确保没有其他正在运行的线程可以访问它。
在正常情况下,最好单独拆卸线程
答案 2 :(得分:0)
线程分离自身是否正确是您的程序资源所有权合同的问题。如果你想要一个类比,pthread_detach
和pthread_join
到pthread_t
,free
是指malloc
获得的指针,或close
是文件描述符。因此,在自身上进行线程调用pthread_detach
就像拥有一个函数,该函数作为对象上的对象调用free
的方法。这不是本身错误,但它是相当非惯用的,可能会让来电者感到困惑。如果没有别的,你必须记录作为代码接口的一部分,调用者不能在线程上使用pthread_join
,如果调用者需要一种机制来确定线程的工作何时完成,你必须提供另一种机制。 / p>