linux下线程中pthread_detach与pthread_join区别

一.linux下线程pthread_detach的示例

1.简单示例

#include <pthread.h>

#include <stdio.h>

#include <unistd.h>

void* thread_function(void* arg) {

printf("线程正在运行\n");

sleep(2);

printf("线程结束\n");

return NULL;

}

int main() {

pthread_t thread;

// 创建线程

pthread_create(&thread, NULL, thread_function, NULL);

// 将线程设置为分离状态

pthread_detach(thread);

// 注意:这里不能再使用 pthread_join(thread, NULL),因为线程已经分离

// 主线程等待一段时间,以便观察分离线程的输出

sleep(3);

return 0;

}

2.pthread_detach实际应用

#include <stdio.h>

#include <pthread.h>

#include <unistd.h>

#include <string.h>

// 网络服务器场景:为每个客户端连接创建分离线程

void* handle_client(void* arg) {

int client_fd = *(int*)arg;

// 处理客户端请求

printf("处理客户端连接 %d\n", client_fd);

sleep(1); // 模拟处理时间

printf("客户端 %d 处理完成\n", client_fd);

return NULL;

}

int main() {

// 模拟多个客户端连接

int client_connections\[\] = {101, 102, 103, 104, 105};

int num_clients = sizeof(client_connections) / sizeof(client_connections0);

pthread_t threadsnum_clients;

for(int i = 0; i < num_clients; i++) {

printf("接受客户端连接: %d\n", client_connectionsi);

if(pthread_create(&threadsi, NULL, handle_client, &client_connectionsi) != 0) {

perror("创建线程失败");

continue;

}

// 分离线程,让它们独立运行

pthread_detach(threadsi);

}

// 主线程可以继续接受新连接

printf("主线程继续监听新连接...\n");

sleep(3); // 模拟继续工作

return 0;

}

3.pthread_join应用简单示例

#include <stdio.h>

#include <stdlib.h>

#include <pthread.h>

#include <unistd.h>

// 线程函数

void* worker(void* arg) {

int id = *(int*)arg;

printf("工作线程 %d: 开始工作\n", id);

// 模拟工作(耗时操作)

for(int i = 1; i <= 3; i++) {

printf("工作线程 %d: 第 %d 步\n", id, i);

sleep(1);

}

printf("工作线程 %d: 工作完成\n", id);

// 返回计算结果

int* result = malloc(sizeof(int));

*result = id * 100;

return (void*)result;

}

int main() {

pthread_t thread1, thread2;

int id1 = 1, id2 = 2;

int* result1;

int* result2;

printf("主线程: 创建线程\n");

// 创建线程1

if(pthread_create(&thread1, NULL, worker, &id1) != 0) {

perror("创建线程1失败");

return 1;

}

// 创建线程2

if(pthread_create(&thread2, NULL, worker, &id2) != 0) {

perror("创建线程2失败");

return 1;

}

printf("主线程: 等待线程完成...\n");

// 等待线程1完成

if(pthread_join(thread1, (void**)&result1) != 0) {

perror("等待线程1失败");

} else {

printf("主线程: 线程1返回结果 = %d\n", *result1);

free(result1); // 释放线程分配的内存

}

// 等待线程2完成

if(pthread_join(thread2, (void**)&result2) != 0) {

perror("等待线程2失败");

} else {

printf("主线程: 线程2返回结果 = %d\n", *result2);

free(result2); // 释放线程分配的内存

}

printf("主线程: 所有线程完成,程序结束\n");

return 0;

}

二.pthread_detach与pthread_join区别

1.int pthread_detach(pthread_t thread);

作用:将线程标记为"分离状态"

参数:thread - 要分离的线程ID

返回值:成功返回0,失败返回错误码

****常见的错误是:****尝试分离一个已经分离的线程,或者线程ID无效。

2.pthread_detach与pthread_join的区别:

pthread_join:同步等待线程结束(阻塞),并回收资源,获取返回值。

pthread_detach:异步执行(非阻塞),线程结束后自动回收资源,无法获取返回值。

总结:

pthread_detach(threadsi); 用于将线程threadsi设置为分离状态,这样当线程结束时,系统会自动回收其资源,无需其他线程显式地等待它结束。这适用于那些不需要同步等待结果的后台任务。

相关推荐
凡人叶枫9 小时前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
云栖梦泽9 小时前
玩转RK3506SDK
linux·嵌入式硬件
极客先躯9 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
Java面试题总结9 小时前
Linux-Ubantu-贴士-apt的地盘
linux·运维·服务器
●VON10 小时前
AtomGit Flutter鸿蒙客户端:数据模型
android·服务器·安全·flutter·harmonyos·鸿蒙
志栋智能10 小时前
超自动化巡检:提升MTTR,缩短业务影响时间
运维·自动化
酉鬼女又兒10 小时前
零基础入门计算机网络:网络层核心任务、三大关键问题、两种服务类型与 TCP/IP 网际层协议体系全解析
服务器·网络·网络协议·tcp/ip·计算机网络·php·求职招聘
kong@react10 小时前
Rocky Linux 10.2 全面解析:企业级 CentOS 替代方案及保姆级docker安装
java·linux·运维·docker
Gauss松鼠会11 小时前
【GaussDB】GaussDB重要通信参数汇总
服务器·网络·数据库·sql·性能优化·gaussdb·经验总结
凡人叶枫11 小时前
Effective C++ 条款07:为多态基类声明 virtual 析构函数
linux·c语言·开发语言·c++