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设置为分离状态,这样当线程结束时,系统会自动回收其资源,无需其他线程显式地等待它结束。这适用于那些不需要同步等待结果的后台任务。

相关推荐
高晶12 分钟前
ARM 嵌入式 Linux 文件系统从入门到实战:目录结构、权限管理、选型与挂载排查全攻略
linux·程序员
南棋网络安全27 分钟前
ssrf跨站请求伪造(保姆级教程)
运维·服务器·网络·网络安全
运维全世界29 分钟前
Slurm集群搭建实战踩坑:存储节点无RAID、跨节点GPU无法读取数据彻底解决
linux
帷幕落秋32 分钟前
进程服务与文件描述符
linux·运维·面试
用户2095835923033 分钟前
谛听(Diting)开发W7:检出率从 27% 到 100%,规则包从 19 条扩到 27 条
linux
帷幕落秋35 分钟前
信号、Ctrl 组合键与进程状态
linux·运维·面试
大能嘚吧嘚44 分钟前
Debian13系统安装
linux
qetfw1 小时前
grep 文本筛选:匹配、反选与退出状态验证
linux·shell
开开心心就好1 小时前
文件被占用删不掉?解锁工具强制删除
java·运维·服务器·开发语言·前端·pdf·ocr
就像楞次定律1 小时前
【Linux 学习记之一】日常生产力工具与终端流的高效闭环实践(1)
linux