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

相关推荐
GlobalSign数字证书1 小时前
小企业零运维 TLS 架构设计:证书生命周期管理(CLM)与自动化轮换策略的技术选型
运维·自动化
mCell1 小时前
GitHub Actions 玩法大赏:一台远程主机的七种活法
linux·github·agent
盐焗鹌鹑蛋1 小时前
【Linux】动静态库的制作与使用
linux
wuyk5552 小时前
Python 第三章:列表 List
服务器·开发语言·python
艾伦_耶格宇2 小时前
【ELK】-4 logstash的搭建及操作
linux·运维·ubuntu·elk
mifengxing3 小时前
文件逻辑结构、物理结构与磁盘空闲存储空间管理
大数据·linux·运维·操作系统·计算机408
听你说323 小时前
智亮苍南・绿动未来!中节能晶和科技打造浙南县域智慧照明示范样板
大数据·运维·人工智能·科技
xcLeigh4 小时前
Go入门:无类型常量与类型常量的区别
服务器·开发语言·golang
小此方5 小时前
Re:Linux系统篇(五十七)线程篇 · 十:基于环形缓冲的生产者消费者模型与信号量
linux·运维·驱动开发
fanged5 小时前
Linux的DD命令
linux·运维·服务器