线程操作——创、取、终、分、连

文章目录

    • 线程相关函数
    • 线程创建
      • 注意:
    • 线程终止
    • 线程ID获取
    • 线程比较
    • 连接终止线程——回收资源
    • 线程分离——终止后自动回收资源
    • 线程取消——中途终止

线程相关函数

线程操作——创、取、终、分、连_第1张图片
main函数执行的线程叫主线程(main线程),其余创建出来的叫子线程。

线程创建

线程操作——创、取、终、分、连_第2张图片
这是子线程:
线程操作——创、取、终、分、连_第3张图片

这是主线程(main线程):
线程操作——创、取、终、分、连_第4张图片

注意:

线程是第三方的库,编译的时候需要指定库名称
报错如下:
在这里插入图片描述
/tmp/ccYjRary.o:在函数‘main’中:
main.c:(.text+0x65):对‘pthread_create’未定义的引用
collect2: error: ld returned 1 exit status

解决方法:
gcc main.c -o App -l pthread
线程操作——创、取、终、分、连_第5张图片

线程终止

线程操作——创、取、终、分、连_第6张图片
在这里插入图片描述

线程ID获取

线程号在ubuntu下是无符号长整型,%ld
线程操作——创、取、终、分、连_第7张图片

线程比较

线程操作——创、取、终、分、连_第8张图片

连接终止线程——回收资源

回收子线程资源,解决僵尸线程问题。
阻塞函数。
线程操作——创、取、终、分、连_第9张图片

//线程
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);

线程分离——终止后自动回收资源

自动释放资源给系统
线程操作——创、取、终、分、连_第10张图片
==注意:==设置分离后,再对相同的子线程进行join连接会出错。分离后就不要进行连接了。

线程取消——中途终止

调用后线程不是立刻终止。
系统调用到取消点时才会终止取消的线程(可以用man pthreads查看)
线程操作——创、取、终、分、连_第11张图片
粗略的理解为从用户区到内核区的切换,这个位置称为取消点。
注意:线程取消后不会自动释放资源,需要进行连接终止线程(pthread_join(tid, NULL)),若线程已调用线程分离,则无需连接终止线程

你可能感兴趣的:(Linux,性能优化,linux,笔记,学习)