6.2、线程控制的相关函数

1、pthread_create函数

创建一个新线程。作用,对应进程中fork() 函数。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
返回值:成功:0;失败:错误号	-----Linux环境下,所有线程特点,失败均直接返回错误号。
参数:	
	pthread_t:当前Linux中可理解为:typedef  unsigned long int  pthread_t;
	参数1:传出参数,保存系统为我们分配好的线程ID
	参数2:通常传NULL,表示使用线程默认属性。若想使用具体属性也可以修改该参数。
	参数3:函数指针,指向线程主函数(线程体),该函数运行结束,则线程结束。
	参数4:线程主函数执行期间所使用的参数。

attr参数表示线程属性,暂不讨论线程属性,先传NULL给attr参数,表示线程属性取缺省值,可参考APUE。

2、pthread_exit函数

将单个线程退出
	void pthread_exit(void *retval);	
	参数:retval表示线程退出状态,通常传NULL
	
	线程中,禁止使用exit函数,会导致进程内所有线程全部退出。
	另注意,pthread_exit或者return返回的指针所指向的内存单元
必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,
因为当其它线程得到这个返回指针时线程函数已经退出了。

3、pthread_join函数

阻塞等待线程退出,获取线程退出状态		其作用,对应进程中 waitpid() 函数。
	int pthread_join(pthread_t thread, void **retval); 
	返回值:成功:0;失败:错误号
	参数:thread:线程ID (【注意】:不是指针);retval:存储线程结束状态。

注意:
调用该函数的线程将挂起等待,直到id为thread的线程终止。thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:
1.如果thread线程通过return返回,retval所指向的单元里存放的是thread线程函数的返回值。
2.如果thread线程被别的线程调用pthread_cancel异常终止掉,retval所指向的单元里存放的是常数PTHREAD_CANCELED。
3.如果thread线程是自己调用pthread_exit终止的,retval所指向的单元存放的是传给pthread_exit的参数。
4.如果对thread线程的终止状态不感兴趣,可以传NULL给retval参数。

4、pthread_detach函数

实现线程分离
	int pthread_detach(pthread_t thread);	
	返回值:成功:0;失败:错误号
	线程分离状态:指定该状态,线程主动与主控线程断开关系。线程结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。
	进程若有该机制,将不会产生僵尸进程。僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。
	也可使用 pthread_create函数参2(线程属性)来设置线程分离。

5、pthread_cancel函数

杀死(取消)线程其作用,对应进程中 kill() 函数。
int pthread_cancel(pthread_t thread);
返回值:成功:0;失败:错误号
【注意】:线程的取消并不是实时的,而有一定的延时。需要等待线程到达某个取消点(检查点)。

取消点:是线程检查是否被取消,并按请求进行动作的一个位置。通常是一些系统调用creat,open,pause,close,read,write..... 执行命令man 7 pthreads可以查看具备这些取消点的系统调用列表。
可粗略认为一个系统调用(进入内核)即为一个取消点。如线程中没有取消点,可以通过调用pthreestcancel函数自行设置一个取消点。
被取消的线程,	退出值定义在Linux的pthread库中。常数PTHREAD_CANCELED的值是-1。可在头文件pthread.h中找到它的定义:#define PTHREAD_CANCELED ((void *) -1)。因此当我们对一个已经被取消的线程使用pthread_join回收时,得到的返回值为-1

6、pthread_self函数

获取线程ID。其作用对应进程中 getpid() 函数。
pthread_t pthread_self(void);
返回值:成功:0;失败:无!

线程ID:pthread_t类型,本质:在Linux下为无符号整数(%lu),其他系统中可能是结构体实现
线程ID是进程内部,识别标志。(两个进程间,线程ID允许相同)
注意:不应使用全局变量 pthread_t tid,在子线程中通过pthread_create传出参数来获取线程ID,而应使用pthread_self。

7、pthread_equal函数

比较两个线程ID是否相等。
int pthread_equal(pthread_t t1, pthread_t t2);
可能Linux在未来线程ID pthread_t 类型被修改为结构体实现。

8、注意pthread_join和pthread_detach这两个函数不能一起使用

	原因:一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join,这样的调用将返回EINVAL错误。也就是说,如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。

9、终止线程方式

		总结:终止某个线程而不终止整个进程,有三种方法:
				1.从线程主函数return。这种方法对主控线程不适用,从main函数return相当于调用exit。
				2.一个线程可以调用pthread_cancel终止同一进程中的另一个线程。
				3.线程可以调用pthread_exit终止自己。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值