分离式 POSIX 线程与可连接 POSIX 线程
- 2024-10-25 08:42:00
- admin 原创
- 211
问题描述:
我一直在使用pthread
C 语言中的库来创建和连接线程。
我应该什么时候从一开始就创建一个分离线程?与可连接线程相比,它是否具有任何性能优势?
在可连接 (默认情况下) 线程上不执行 是否合法
pthread_join()
?或者这样的线程是否应始终在 ingdetach()
之前使用该函数pthread_exit()
?
解决方案 1:
当您知道不想等待时,请创建一个分离线程
pthread_join()
。唯一的性能优势是,当分离线程终止时,可以立即释放其资源,而不必等待线程连接后才能释放资源。不加入可加入的线程是“合法的”;但通常不建议这样做,因为(如前所述)在线程加入之前不会释放资源,因此如果不加入线程,资源将无限期地保持绑定状态(直到程序退出)。
解决方案 2:
我应该什么时候从一开始就创建一个分离的线程?
每当应用程序不关心该线程何时完成并且不关心其线程的返回值时(线程可以通过将值传回给其他线程/应用程序pthread_exit
)。
例如,在客户端-服务器应用程序模型中,服务器可能会创建一个新线程来处理每个请求。但服务器本身并不关心线程的返回值。在这种情况下,创建分离线程是有意义的。
服务器唯一需要确保的是当前处理的请求已完成。它只需退出主线程即可完成此操作,而无需退出整个程序/应用程序。当进程中的最后一个线程退出时,应用程序/程序将自然退出。
伪代码可能看起来像:
/* A server application */
void process(void *arg)
{
/* Detach self. */
pthread_detach(pthread_self());
/* process a client request. */
pthread_exit(NULL);
}
int main(void)
{
while (not_done) {
pthread_t t_id;
errno = pthread_create(&t_id, NULL, process, NULL);
if (errno) perror("pthread_create:");
}
/* There may be pending requests at this point. */
/* Just exit the main thread - not the whole program - so that remaining
requests that may still be processed can continue. */
pthread_exit(NULL);
}
另一个示例可能是守护进程或记录器线程,它在应用程序运行时定期记录一些信息。
与可连接线程相比,它是否具有任何性能优势?
从性能角度来看,可连接线程与分离线程之间没有区别。唯一的区别在于,对于分离线程,其资源(例如线程堆栈和任何关联的堆内存等 - 这些“资源”的确切构成是特定于实现的)。
不在可连接(默认)线程上执行 pthread_join() 是否合法?
是的,不与线程连接是合法的。pthread_join
这只是一个便利函数,除非你需要,否则绝对不需要使用。但请注意,默认情况下创建的线程是可连接线程。
您可能想要加入的一个示例是当线程执行在它们之间分配的“部分”工作时。在这种情况下,您需要在继续之前检查所有线程是否完成。任务场并行就是一个很好的例子。
或者这样的线程在 pthread_exit() 之前是否应始终使用 detach() 函数?
没必要。但是您经常需要在创建时决定是需要可连接线程还是分离线程。
PTHREAD_CREATE_DETACHED
请注意,虽然可以通过调用 设置属性来创建可分离线程pthread_attr_setdetachstate
,但线程决定可以决定在任何时间点分离自身,例如使用pthread_detach(pthread_self())
。此外,具有另一个线程的线程 id ( ) 的线程pthread_t
可以使用 分离pthread_detach(thread_id);
。
扫码咨询,免费领取项目管理大礼包!