文章目录
- 线程相关函数
- 线程创建
- 注意:
- 线程终止
- 线程ID获取
- 线程比较
- 连接终止线程——回收资源
- 线程分离——终止后自动回收资源
- 线程取消——中途终止
线程相关函数
main函数执行的线程叫主线程(main线程),其余创建出来的叫子线程。
线程创建
这是子线程:
这是主线程(main线程):
注意:
线程是第三方的库,编译的时候需要指定库名称
报错如下:
/tmp/ccYjRary.o:在函数‘main’中:
main.c:(.text+0x65):对‘pthread_create’未定义的引用
collect2: error: ld returned 1 exit status
解决方法:
gcc main.c -o App -l pthread
线程终止
线程ID获取
线程号在ubuntu下是无符号长整型,%ld
。
线程比较
连接终止线程——回收资源
回收子线程资源,解决僵尸线程问题。
阻塞函数。
//线程
void * callback2(void * arg)
{
int a = 10;
printf("i am a thread, the num is:%d\n", *(int *)arg+2);
pthread_exit(&a);
}
//连接终止线程并获取返回值
int **val;
pthread_join(tid, (void **) val);
printf("val is : %d\n", **val);
两种写的方式——这个好点
int *val;
pthread_join(tid, (void **) &val);
printf("val is : %d\n", *val);
线程分离——终止后自动回收资源
自动释放资源给系统
==注意:==设置分离后,再对相同的子线程进行join连接会出错。分离后就不要进行连接了。
线程取消——中途终止
调用后线程不是立刻终止。
系统调用到取消点时才会终止取消的线程(可以用man pthreads
查看)
粗略的理解为从用户区到内核区的切换,这个位置称为取消点。
注意:线程取消后不会自动释放资源,需要进行连接终止线程(pthread_join(tid, NULL)
),若线程已调用线程分离,则无需连接终止线程