thrd_detach
来自cppreference.com
在标头 <threads.h> 定义
|
||
int thrd_detach( thrd_t thr ); |
(C11 起) | |
将 thr
所标识的线程从当前环境中分离。一旦该线程退出,就自动释放其保有的资源。如果线程非分离状态则需要 join 等待线程结束,否则会产生一个僵尸线程。
参数
thr | - | 要分离的线程的标识符 |
返回值
若成功则为 thrd_success,否则为 thrd_error。
僵尸线程产生的示例
运行此代码
#include<stdio.h> #include<stdint.h> #include<threads.h> int test_fn(void *arg){ return 0; } int test_detach_fn(void *arg){ thrd_detach(thrd_current()); return 0; } int main(){ thrd_t th; int16_t i = 0; int ret = 0; int32_t status = 0; // 循环创建线程,但是不等待线程结束,但分离线程。 for(i = 0; i < INT16_MAX; ++i) { status = thrd_create(&th, test_detach_fn, NULL); if(status != thrd_success) { printf("detach fail %d\n", i); break; } } // 循环创建线程,但是等待线程结束,但不分离线程。 for(i = 0; i < INT16_MAX; ++i) { status = thrd_create(&th, test_fn, NULL); if(status != thrd_success) { printf("join nodetach fail %d\n", i); break; } thrd_join(th, &ret); } // 循环创建线程,但是不等待线程结束,也不分离线程。 for(i = 0; i < INT16_MAX; ++i) { status = thrd_create(&th, test_fn, NULL); if(status != thrd_success) { printf("nodetach fail %d\n", i); break; } } return 0; } /* 如果你尝试用 gcc 编译,记得链接线程库 gcc xx.c -o xx -lpthread */
输出:
nodetach fail 32754
引用
- C17 标准(ISO/IEC 9899:2018):
- 7.26.5.3 The thrd_detach function (第 280 页)
- C11 标准(ISO/IEC 9899:2011):
- 7.26.5.3 The thrd_detach function (第 383-384 页)
参阅
(C11) |
阻塞到线程终止为止 (函数) |