3

我正在写一个多线程服务器程序,它回显客户端发送的数据。我为每个客户端生成一个线程。在线程的启动例程中,我正在接收客户端的数据并将其回显。

如果客户端断开连接,那么我将使用 将该线程设置为已分离pthread_detach(pthread_self()),以便在退出时,可以按照此处给出的方式回收线程的存储。

所以我想问这个: 1)单独分离
线程是否正确? 2)在程序中的任何地方将线程设置为分离(单独)是否正确,即在创建线程之后或创建线程时是否不需要这样做?

PS:我的程序运行良好,但是因为在多线程程序中,即使有错误,最初也可能不会出现,所以我想解决这两个问题。

4

3 回答 3

2

每个线程都必须加入或分离,并且对于每个成功启动的线程都必须发生其中之一。如何以及何时这样做完全取决于您。

问题2没有多大意义:线程仅在执行时执行(重言式),并且您只能在执行时调用函数。因此,线程可以在仍在运行时自行分离,但之后当然不会(因为它不再运行)。

于 2013-08-23T10:51:30.123 回答
1

线程分离自身是否正确取决于程序的资源所有权合同。如果你想要一个类比,pthread_detach并且原样pthread_join指向由 获得的指针,或者原样指向文件描述符。因此,对自身进行线程调用非常类似于对对象进行对象调用的函数。它本质上不是错误的,但它相当不习惯,可能会让调用者感到困惑。如果没有别的,您必须将调用者不能在线程上使用的代码接口的一部分记录为调用者,并且如果调用者需要一种机制来确定线程的工作何时完成,则必须提供另一种机制。pthread_tfreemallocclosepthread_detachfreepthread_join

于 2013-08-23T12:42:50.010 回答
1

单独分离线程没有问题,但是要注意线程被正确分离,并且线程分离后没有人可以访问它。销毁对象线程,thread::id以便没有变量可以保留,并确保在线程分离后没有其他正在运行的线程可以访问它。在正常情况下,最好自行分离线程

于 2013-08-23T11:01:10.270 回答