pthread_detach函数讲解

pthread_detach()是POSIX标准中的函数,用于将线程设置为可分离状态,以便线程结束后资源能自动回收,无需其他线程通过pthread_join()等待其结束。一旦线程被分离,就不能恢复连接状态,因此在调用前需确保不再需要通过pthread_join()来同步。
pthread_detach 

的全称是

pthread_detach() 

。它是 POSIX 线程库中的一个函数,用于将一个线程标记为可分离状态,以使得该线程在退出时可以自动回收其资源,无需其他线程调用

pthread_join() 

来等待其结束。 具体来说,

pthread_detach() 

函数的原型为

int pthread_detach(pthread_t thread) 

。它接受一个线程标识符

thread 

作为参数,用于指定需要分离的线程。 通过调用

pthread_detach() 

函数将线程标记为可分离状态后,当该线程结束时,它的资源(包括线程栈等)会被自动回收,无需其他线程调用

pthread_join() 

来进行回收。这使得主线程或其他线程可以继续执行,而不必等待被分离的线程结束。 需要注意的是,一旦线程被标记为可分离状态,就无法再次将其状态改为可连接状态。因此,在调用

pthread_detach() 

函数之前,需要确保不再需要通过

pthread_join() 

来等待该线程的结束。

您是一位c++老师,我是一位新手学员,刚刚我在上学习c++,但是网课老师没有很好的解释和告知代码编译每个环节的作用,每个成员的作用,这里请你根据代码分析,并以一下方式解答: 1.首先告知代码是怎么跑的,最好是整个流程图解(小白友好版) 2.主要是讲什么内容 3.其次对里面的每个成员和环节和作用进行解释教学,方便新手学员看懂。 代码如下: int clnt_socks[100] = { 0 }; int clnt_cnt = 0; pthread_mutex_t mutex1; void send_msg(const char* msg, ssize_t str_len) { pthread_mutex_lock(&mutex1); for (int i = 0; i < clnt_cnt; i++) { if (clnt_socks[i] >= 0) write(clnt_socks[i], msg, str_len); } pthread_mutex_unlock(&mutex1); } void* handle_clnt(void* arg) { pthread_detach(pthread_self()); int clnt_sock = *(int*)arg; char msg[1024] = ""; ssize_t str_len = 0; while ((str_len = read(clnt_sock, msg, sizeof(msg))) > 0) { //TODO:过滤敏感词 send_msg(msg, str_len); } pthread_mutex_lock(&mutex1); //for (int i = 0; i < clnt_cnt; i++) {//TDDO:优化逻辑 // if (clnt_sock == clnt_socks[i]) { // clnt_socks[i] = -1; // break; // } //} *(int*)arg = -1; pthread_mutex_unlock(&mutex1); close(clnt_sock); pthread_exit(NULL); } void server98() { int serv_sock, clnt_sock; struct sockaddr_in serv_adr, clnt_adr; socklen_t clnt_adr_sz = sizeof(clnt_adr); serv_sock = socket(PF_INET, SOCK_STREAM, 0); memset(&serv_adr, 0, sizeof(serv_adr)); serv_adr.sin_family = AF_INET; serv_adr.sin_addr.s_addr = htonl(INADDR_ANY); serv_adr.sin_port = htons(9527); pthread_mutex_init(&mutex1, NULL); if (bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr)) == -1) { printf("bind error %d %s", errno, strerror(errno)); return; } if (listen(serv_sock, 5) == -1) { printf("listen error %d %s", errno, strerror(errno)); return; } for (;;) {//while(1)等价 clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz); if (clnt_sock == -1) { printf("accept error %d %s", errno, strerror(errno)); break; } pthread_mutex_lock(&mutex1); clnt_socks[clnt_cnt++] = clnt_sock; pthread_mutex_unlock(&mutex1); pthread_t thread; pthread_create(&thread, NULL, handle_clnt, &clnt_socks[clnt_cnt - 1]); } close(serv_sock); pthread_mutex_destroy(&mutex1); } sem_t semid; char name[64] = "[DEFAULT]"; void* client_send_msg(void* arg) { pthread_detach(pthread_self()); int sock = *(int*)arg; char msg[256] = ""; char buffer[1024]; while (true) { memset(buffer, 0, sizeof(buffer)); fgets(msg, sizeof(msg), stdin); if ((strcmp(msg, "q\n") == 0) || (strcmp(msg, "Q\n") == 0)) { break; } snprintf(buffer, sizeof(msg), "%s %s", name, msg); write(sock, buffer, strlen(buffer)); } sem_post(&semid); pthread_exit(NULL); } void* client_recv_msg(void* arg) { pthread_detach(pthread_self()); int sock = *(int*)arg; char msg[256] = ""; while (true) { ssize_t str_len = read(sock, msg, sizeof(msg)); if (str_len <= 0)break; fputs(msg, stdout); memset(msg, 0, str_len); } sem_post(&semid); pthread_exit(NULL); } void client98() { int sock = socket(PF_INET, SOCK_STREAM, 0); struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); serv_addr.sin_port = htons(9527); fputs("input your name:", stdout); scanf("%s", name); if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) { printf("connect error %d %s", errno, strerror(errno)); return; } pthread_t thsend, threcv; sem_init(&semid, 0, -1); pthread_create(&thsend, NULL, client_send_msg, (void*)&sock); pthread_create(&threcv, NULL, client_recv_msg, (void*)&sock); sem_wait(&semid); close(sock); } void lession98(const char* arg) { if (strcmp(arg, "s") == 0) { server98(); } else { client98(); } }
09-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值