多线程函数的一点笔记

1.pthread_cancel
pthread_cancel取消线程,只是一个request,不一定真的起作用注意到使用了pthread_cancel之后,仍然要使用
pthread_join函数等待子线程结束;如果子线程被成功取消,那么pthread_join函数取到的状态将为
PTHREAD_CANCELED。如果pthread_cancle的时候,线程已经不存在,则该方法将会返回ESRCH错误 

2.void pthread_exit(void *retval)
int pthread_join(pthread_t th, void **thread_return)

pthread_join()的调用者将挂起并等待th线程终止,retval是pthread_exit()调用者线程(线程ID为th)的返回值,
如果thread_return不为NULL,则*thread_return=retval。
在线程函数中,能用return((void*)10) 或者是pthread_exit((void*)10)这种方式返回数值,也不一定是整型
在主线程中,用pthread_join接受,第二个参数是&value, value是这样定义的void *value = 0;
到最后要打印出接收值时候,强制转换(int)value,然后将其按照整型打出即可,其它类型均是这样。

如果主线程调用pthread_exit,则只有主线程退出,子线程不会退出。但是如果主线程调用exit,则大家一起退出

函数pthread_join用来等待一个线程的结束,这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。

一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:

  extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));

  唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给 thread_return。

//

3.pthread_detach
分离线程pthread_detach
#include <pthread.h>
int pthread_detach(pthread_t tid);
返回值:函数成功返回0。任何其他返回值都表示错误。
将线程设置为脱离线程。即通知线程库在指定的线程终止时回收线程占用的内存等资源。
在一个线程上使用多次pthread_detach的结果是不可预见的。

//

4.pthread_setschedparam
 int pthread_setschedparam(pthread_t target_thread,  int  policy,  const    struct sched_param *param)在多线程开发中经常被使用的,它主要用于设置线程的调用策略和优先级。在介绍它的使用方法之前,我们先简单的介绍一下它的使用参数。

1. target_thread是使用pthread_create所获得的线程ID。

2.线程的调度有三种策略:SCHED_OTHER、SCHED_RR和SCHED_FIFO。Policy用于指明使用哪种策略。下面我们简单的说明一下这三种调度策略。

SCHED_OTHER

它是默认的线程分时调度策略,所有的线程的优先级别都是0,线程的调度是通过分时来完成的。简单地说,如果系统使用这种调度策略,程序将无法设置线程的优先级。请注意,这种调度策略也是抢占式的,当高优先级的线程准备运行的时候,当前线程将被抢占并进入等待队列。这种调度策略仅仅决定线程在可运行线程队列中的具有相同优先级的线程的运行次序。

SCHED_FIFO

它是一种实时的先进先出调用策略,且只能在超级用户下运行。这种调用策略仅仅被使用于优先级大于0的线程。它意味着,使用SCHED_FIFO的可运行线程将一直抢占使用SCHED_OTHER的运行线程J。此外SCHED_FIFO是一个非分时的简单调度策略,当一个线程变成可运行状态,它将被追加到对应优先级队列的尾部((POSIX 1003.1)。当所有高优先级的线程终止或者阻塞时,它将被运行。对于相同优先级别的线程,按照简单的先进先运行的规则运行。我们考虑一种很坏的情况,如果有若干相同优先级的线程等待执行,然而最早执行的线程无终止或者阻塞动作,那么其他线程是无法执行的,除非当前线程调用如pthread_yield之类的函数,所以在使用SCHED_FIFO的时候要小心处理相同级别线程的动作。

SCHED_RR

鉴于SCHED_FIFO调度策略的一些缺点,SCHED_RR对SCHED_FIFO做出了一些增强功能。从实质上看,它还是SCHED_FIFO调用策略。它使用最大运行时间来限制当前进程的运行,当运行时间大于等于最大运行时间的时候,当前线程将被切换并放置于相同优先级队列的最后。这样做的好处是其他具有相同级别的线程能在“自私“线程下执行。

3.param是struct sched_param类型的指针,它仅仅包含一个成员变sched_priority,指明所要设置的静态线程优先级。

 

5.pthread_getschedparam
 int pthread_getschedparam(pthread_t thread, int *policy,struct sched_param *param);
 得到的优先级是param->sched_priority

6.int pthread_setconcurrency(int new_level);new_level一般是当前进程中线程的使用个数,在我们的系统中,往往线程的个数是可以确定下来的,所以一般在初始化函数中显示的设置对应的数值。如果不设置这个函数,那么能够并发的线程数目由实现者来控制,实际上这就是设定能够并发的线程数的。

7.pthread_create 的常见返回值为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值