线程的分离

简介: 线程的分离

pthread_detach 设置线程分离

默认情况下,线程是可连接的(也可称为结合态)。通俗地说,就是当线程退出时,其他线程可以通过调用 pthread_join() 函数获取其返回状态。但有时,在编程过程中,程序并不关心线程的返回状态,只是希望系统在线程终止时能够自动清理并移除。在这种情况下,可以调用 pthread_detach() 函数并向 thread 参数传入指定线程的标识符,将该线程标记为分离状态分离态)。

#include <pthread.h>
int pthread_detach(pthread_t thread);点击复制复制失败已复制


一旦线程处于分离态,就不能再使用 pthread_join() 函数来获取其状态,也无法使其重返“可连接”状态。下面的代码演示了线程的分离操作:

#include <pthread.h>
#include <stdio.h>
#define errlog(errmsg)                                                \
    do {                                                              \
        perror(errmsg);                                               \
        printf("--%s--%s--%d--\n", __FILE__, __FUNCTION__, __LINE__); \
        return -1;                                                    \
    } while (0)
void *thread_handler(void *arg) {
    pthread_detach(pthread_self());
    int count = *((int *)arg);
    while (count > 0) {
        printf("thread2...\n");
        sleep(1);
        count--;
    }
    return NULL;
}
int main(int argc, const char *argv[]) {
    pthread_t thread;
    int arg = 3;
    if (pthread_create(&thread, NULL, thread_handler, (void *)&arg) != 0) {
        errlog("pthread_create error");
    }
    sleep(1);
    if (pthread_join(thread, NULL) == 0) {
        printf("pthread wait success\n");
    } else {
        printf("pthread wait failed\n");
    }
    return 0;
}点击复制复制失败已复制


通过代码可以看出,在程序运行 1 秒后,已经成为分离态的线程,不会被 pthread_join() 函数等待回收。


编译并运行,结果如下:

$ gcc main.c -lpthread && ./a.out 
thread2...
pthread wait failed点击复制复制失败已复制


pthread_attr_setdetachstate 实现线程分离

同理,针对上述设置线程分离状态的方法,也可以在线程刚一创建时即进行分离(而非之后再调用 pthread_detach() 函数)。首先可以采用默认的方式对线程属性结构进行初始化,接着为创建分离线程而设置属性,最后再以此线程属性结构来创建新线程,线程一旦创建,就无需再保留该属性对象。最后将其销毁。


初始化线程属性结构及摧毁函数如下:

#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);点击复制复制失败已复制


设置线程分离状态的函数为 pthread_attr_setdetachstate()

#include <pthread.h>
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);点击复制复制失败已复制


参数 detachstate 用来设置线程的状态,设置 PTHREAD_CREATE_DETACHED分离态)与 PTHREAD_CREATE_JOINABLE结合态)。

#include <pthread.h>
#include <stdio.h>
#define errlog(errmsg)                                                \
    do {                                                              \
        perror(errmsg);                                               \
        printf("--%s--%s--%d--\n", __FILE__, __FUNCTION__, __LINE__); \
        return -1;                                                    \
    } while (0)
void *thread_handler(void *arg) {
    printf("thread...\n");
    return NULL;
}
int main(int argc, const char *argv[]) {
    pthread_t thread;
    pthread_attr_t attr;
    if (pthread_attr_init(&attr) != 0) {
        errlog("pthread_attr_init error");
    }
    if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0) {
        errlog("pthread_attr_setdetachstate error");
    }
    if (pthread_create(&thread, &attr, thread_handler, NULL) != 0) {
        errlog("pthread_create error");
    }
    sleep(1);
    if (pthread_join(thread, NULL) == 0) {
        printf("pthread wait success\n");
    } else {
        printf("pthread wait failed\n");
    }
    return 0;
}点击复制复制失败已复制


编译并运行,结果如下:

$ gcc main.c -lpthread && ./a.out 
thread...
pthread wait failed
目录
相关文章
|
22天前
|
存储 安全 Linux
【探索Linux】P.19(多线程 | 线程的概念 | 线程控制 | 分离线程)
【探索Linux】P.19(多线程 | 线程的概念 | 线程控制 | 分离线程)
14 0
|
22天前
|
存储 安全 Java
【亮剑】`ConcurrentHashMap`是Java中线程安全的哈希表,采用锁定分离技术提高并发性能
【4月更文挑战第30天】`ConcurrentHashMap`是Java中线程安全的哈希表,采用锁定分离技术提高并发性能。数据被分割成多个Segment,每个拥有独立锁,允许多线程并发访问不同Segment。当写操作发生时,计算键的哈希值定位Segment并获取其锁;读操作通常无需锁定。内部会根据负载动态调整Segment,减少锁竞争。虽然使用不公平锁,但Java 8及以上版本提供了公平锁选项。理解其工作原理对开发高性能并发应用至关重要。
|
存储 Linux 调度
【Linux】线程分离 | 线程库 | C++调用线程 | 线程局部存储
【Linux】线程分离 | 线程库 | C++调用线程 | 线程局部存储
111 0
|
存储 Linux 调度
Linux多线程:线程概念、线程间的独有与共享、多线程VS多进程,线程控制:线程创建、线程终止、线程等待、线程分离
Linux多线程:线程概念、线程间的独有与共享、多线程VS多进程,线程控制:线程创建、线程终止、线程等待、线程分离
198 0
|
物联网 Linux 开发者
Pthred_detach 线程分离|学习笔记
快速学习 Pthred_detach 线程分离
73 0
Pthred_detach 线程分离|学习笔记
|
Linux
Linux系统编程-(pthread)线程的使用案例(分离属性、清理函数等)
这篇文章介绍Linux下线程的创建与基本使用案例,主要是案例代码为主;相关的函数详细介绍在上篇文章里已经介绍过了。
192 0
|
Linux 调度 Android开发
【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )(二)
【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )(二)
279 0
|
调度 C++
【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )(一)
【C++ 语言】线程 ( 线程创建方法 | 线程标识符 | 线程属性 | 线程属性初始化 | 线程属性销毁 | 分离线程 | 线程调度策略 | 线程优先级 | 线程等待 )(一)
233 0