嵌入式笔记18 主动退出 分离函数 进和线区别


一、主动退出

pthread_exit()
头文件

#include <pthread.h>

void pthread_exit(void *retval);

1、功能

1、功能
线程调用这个函数时,可以主动退出(终止)
它和exit()很像,exit()是终止整个程序,而pthread_exit()是终止次线程(并未终止整个进程)
如果你在次程序里面调用错误,调用的是exit(),整个线程就终止了

2、返回值

成功返回 0,失败返回非零值

3、参数

retval:线程结束的返回值
如果返回值很多时,就会封装成一个结构体,返回结构体变量的地址即可

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>


int i = 0;
int num = 5;
void *thread1(void *arg)
{
 
   
    
    while(1)
    {
	printf("hello world!\n");
	sleep(2);
	pthread_exit(&num);
    }

}



int main()
{
    pthread_t id1;

    if(pthread_create(&id1, NULL, thread1, NULL) != 0)
    {
	perror("pthread_create error!\n");
	exit(1);
    
    }
    sleep(2);
    int *num;

    pthread_cancel(id1);

    pthread_join(id1, (void *)(&num));

    printf("this is thread! %d\n",*num);
    //,*((int *)num)

    return 0;
}

*return()
return (void )0;

注册线程退出处理函数
void pthread_cleanup_push(void (*routine)(void *
),void *arg);
void pthread_cleanup_pop(int execute);
弹栈线程退出处理函数的的几种条件:
pthread_cleanup_push(!0)主动弹栈
(0是不弹栈)
如果线程是被别人调用pthread_cancal取消的,也会弹栈
如果调用pthread_exit函数也是会主动弹栈
注意:return退出的话不会主动弹栈,想要自动弹栈用
void pthread_cleanup_pop(!0)

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>


int i = 0;
int num = 5;

void *theard_exit(void *arg)
{
    printf("my exit!\n");
}

void *thread1(void *arg)
{
    pthread_cleanup_push(pthread_exit, NULL);
    while(1)
    {
	printf("hello world!\n");
	sleep(1);
	//pthread_exit(&num);
	pthread_exit(NULL);
	//return (void *)0;
    }
    pthread_cleanup_pop(!0);

}



int main()
{
    pthread_t id1;

    if(pthread_create(&id1, NULL, thread1, NULL) != 0)
    {
	perror("pthread_create error!\n");
	exit(1);
    
    }
    sleep(1);

    int *num;

    pthread_cancel(id1);

    pthread_join(id1, NULL);

    printf("this is thread! %d\n",*((int *)num));

    return 0;
}

4、线程等待目的

1、保证线程的退出顺序:保证一个线程退出并且回收资源后允许下一个进程退出
2、回收线程退出时的资源情况:保证当前线程退出后,创建的新线程不会复用刚才退出线程的地址空间
3、获得新线程退出时的结果是否正确退出返回值

5、线程状态

1、可结合态:这种状态下的线程是能被其他进程回收资源或被杀死的
2、可分离态:不能被其他进程回收资源或被杀,它存储的资源在它终止时由系统自动回收
默认情况下,线程是可结合态

二、线程分离函数

pthread_detach()
头文件

#include <pthread.h>

参数函数
int pthread_detach(pthread_t thread);

1、功能

如果次线程不希望别人调用pthread_join函数来回收,而是希望自己在运行结束时,自动回收资源调用pthread_detach
将pthread_detach()中的线程变为分离状态
(当一个分离线程终止时,它的资源会自动释放,返回系统,而不需要另一个线程与终止的线程连接)

注:把一个线程的属性设置为 detachd 的状态,让系统来回收它的资源;
把一个线程的属性设置为 joinable 状态,这样就可以使用 pthread_join() 来阻塞的等待一个线程的结束,并回收其资源,并且pthread_join() 还会得到线程退出后的返回值,来判断线程的退出状态 。

2、返回值

成功返回0,错误返回一个非零数字

3、参数

thread:你要分离的那个次线程的TID
example:
在这里插入图片描述
进程的所有基本信息存放在tach_struct
所有用户PId
调用优先级
地址空间
线程切换的实质:函数切换

三、进程和线程的区别

1、进程是资源分配的最小单位,线程是资源调度的最小单位
2、每个进程都有独立的地址空间,多个线程共享进程的地址空间,线程间的切换比进程间的切换开销要小
3、线程的调度必须通过频繁的加锁来保持线程的同步,影响线程的并发性
4、进程比线程更健康,多进程之间相互独立,一个进程的异常对其他进程无影响,而一个线程的崩溃会影响其他线程或整个程序的崩溃
5、线程之间的通信方便(小数据量的),同一进程下线程共享全局变量还有静态变量等数据,而进程间的通信需要一通信的方式进行(IPC),不过如何处理好同步和互斥,是编写多进程程序的难点。

6、多线程代码结构比多进程代码结构简单易读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_49181551

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值