LWP:轻量级进程,因为Linux下的线程是用进程模拟的,所以它比线程大一点,比进程小一点
在
Linux上线程函数位于
libpthread共享库中
,因此在
编译时要加上
-lpthread选项。
************************************************************************************************************************************************************************************************************************
一、创建线程:
thread->线程 id attr->线程属性(可分离,可结合(默认)) start_routine->创建的线程的执行流(即线程对应的函数) arg->执行流的参数
返回值:成功返回0,失败返回错误号。
以前学过的系统函数都是成功返回0,失败返回-1,而错误号保存在全局量errno中。
而pthread库的函数都是通过返回值返回错误号,虽然每个线程也都有一个errno,但这是为了兼容其它函数接口而提供的,pthread库本身并不使用它,通过返回值返回错误码更加清晰。
在一个线程中调用
pthread_create()创建新的线程后,当前线程从
pthread_create()返回继续往下执行。
start_routine返回时,
这个线程就退出了
,其它线程可以调用pthread_join得到start_routine
的返回值,类似于父进程调用
wait(2)得到子进程的退出 状态
等待进程的作用:1、避免僵尸进程;
2、读取子进程的退出结果
3、同步父子进程的执行流
************************************************************************************************************************************************************************************************************************
二、获取线程
id
该函数是获取线程自己的
id ,功能相当于进程中的 getpid.
调用此函数获得的各个线程的id
是不同的,但对于同一进程中的线程来说,它们的进程号都与创建它们的进程的 pid
相同.
************************************************************************************************************************************************************************************************************************
三
、只终止线程而不终止进程的三种方法
(1)从要终止的线程函数中 return ,但从主线程 return 相当于终止整个进程
(2)从线程自己内部调用函数 pthread_exit来终止自己:
retval->线程的退出码
retval是
void *类型
,和线程函数返回值的用法一样
,其它线程可以调用
pthread_join获得这个指针。
(3)一个线程可以调用函数 pthread_cancel 终止同一进程中的另一个线程:
thread->要取消的线程的 id
用该函数终止线程时,线程的退出码是 -1,它是一个宏 ,PTHREAD_CANCELED
查看宏的指令:#grep -R PTHREAD_CANCELED /usr/include/
注意 :pthread_exit 或者return 返回的指针所指向的内存单元必须是全局的或者是用 malloc分
配的,
不能在线程函数的栈上分配
,因为当其它线程得到这个返回指针时线程函数已经退出了。
************************************************************************************************************************************************************************************************************************
四 、线程等待
thread ->被等的那个线程的id retval->通过它得到线程的退出码
调用该函数的线程将挂起等待
,直到
id为
thread的线程终止。
thread线程以不同的方法终止
,通过pthread_join
得到的终止状态是不同的
,总结如下
:
1.
如果
thread线程
通过return返回,value_ptr所指向的单元里存放的是
thread线程函数的返回值。
2.
如果
thread线程被别的线程调用
pthread_cancel异常终掉
,value_ptr所指向的单元里存放的是常数PTHREAD_CANCELED。
3.
如果
thread线程是自己调用
pthread_exit终止的
,value_ptr所指向的单元存放的是传给pthread_exit的参数。
如果对thread线程的终止状态不感兴趣
,可以传NULL给
value_ptr数。
一般情况下
,线程终止后
,其终止状态一直保留到其它线程调用
pthread_join获取它的状态为止。
但是线程也可以被置为 detach
状态,
这样的线程一旦终止就立刻回收它占用的所有资源
,
而不保留终止状态。
不能对同一线程调用两次
pthread_join,或者如果已经对一个线程调用
了 pthread_detach就不能再调用pthread_join了。
************************************************************************************************************************************************************************************************************************
五、终止进程的方法
(1)从
main 函数 return
(2)从任意地方调用
exit(退出码)
************************************************************************************************************************************************************************************************************************
六、上述函数的使用例子
本文介绍Linux下线程的创建、获取ID、终止及等待的方法。包括pthread_create、pthread_self、pthread_exit、pthread_cancel和pthread_join等函数的使用,并提供实例说明。
1402

被折叠的 条评论
为什么被折叠?



