原生线程库的函数使用

一、创建线程

int pthread_create(pthread_t* thread, const pthread_attr_t* attr, void* (*start routine)(void*), void* args)

thread:输出型参数,线程id,是一个虚拟地址

attr:线程属性

void* (*start routine)(void*):返回值void*, 参数void*的函数指针,输入函数地址让线程执行

arg:传入函数的参数,不要忘记可以传类对象的地址

返回值:成功返回0,失败返回错误码

二、等待线程

int pthread_join(pthread_t thread, void** retval)

thread:输入线程id

retval:输出型参数,接受线程执行函数的返回值(void*)

三、补充知识一

main和new线程谁先运行是不确定的。

但是我们期望主线程等待新线程退出,这是就要用 pthread_join()

如果主线程比新线程先退出,新线程一起同时退出。

如果新线程先退出,主线程不 join 那么就会产生类似僵尸进程,因为此时没人管新线程。

问题:为什么新线程出错,主线程也没了?

新线程出错,OS会给进程发信号中断进程,里面的所有线程就都会中断。所以线程不会考虑异常退出,只会考虑正常返回。

四、代码一

也可以通过join得到函数返回值

五、线程分离

我们也可以不等待新线程,他跑完之后就自己释放资源。

int pthread_detach(pthread_t thread)

一个线程被创建默认是 joinable,必须要被 join 

一个线程被分离,线程的工作状态时分离状态,不能被 join,但依旧属于进程一部分,只是不要被等待,一个分离的线程出错依旧会终止进程。

六、获取当前线程tid

pthread_t pthread_self(void)

七、代码二

上图是创建一批线程的代码,我们会注意到明明代码中是一个一个创建的线程,但是打印的线程名字是一样的。

原因是char name[128] 属于主线程中栈区之上的变量,多个线程实际指向的是同一块空间,最后一次覆盖后,所有线程都打印 thread-10

这是由于多线程共享同一块区域引发的问题,解决方法就是在堆区动态匹配空间,使不同的线程读取不同的空间,这样就能确保各自信息的独立性。

八、新进程的终止

1、执行函数return后就会终止

2、主线程结束(没有 join)

3、void pthread_exit(void* retval)

注意在线程执行函数中一定不能使用 exit 函数,这函数是专门用来终止进程的,如果使用就会导致线程全部终止。

4、int pthread_cancel(pthread_t thread)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值