登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

白杨

坚持是一种品质,用心是一种习惯! 生活仍在继续……追逐编程质量与效率

 
 
 

日志

 
 

多线程编程指南学习笔记(七)--线程操作  

2012-10-30 16:49:30|  分类: 多线程编程指南学 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

获取线程标示符

pthread_t pthread_self(void);

返回函数调用线程的线程ID。

比较线程标示符:

int pthread_equal(pthread_t tid1 , pthread_t tid2 );

如果tid1和tid2相等,pthread_equal()将返回非零值,否则返回0. 如果tid1或tid2是无效的线程标示符,则结果无法预测。

初始化线程

使用pthread_once (3C) ,可以在首次调用pthread_once 时调用初始化例程。以后调用pthread_once() 将不起作用。

pthread_once_t once_control=PTHREAD_ONCE_INIT; 
int pthread_once(pthread_once_t *once_control,void(*init_routine)(void));

参数:

once_control 控制变量

init_routine 初始化函数

返回值:若成功返回0,若失败返回错误编号。

EINVAL: once_control或init_routine 是NULL 。

类型为pthread_once_t的变量是一个控制变量。控制变量必须使用PTHREAD_ONCE_INIT宏静态地初始化。pthread_once函数首先检查控制变量,判断是否已经完成初始化,如果完成就简单地返回;否则,pthread_once调用初始化函数,并且记录下初始化被完成。如果在一个线程初始时,另外的线程调用pthread_once,则调用线程等待,直到那个现成完成初始话返回。

停止线程执行

使用sched_yield(3RT) ,可以使当前线程停止执行,以便执行另一个具有相同或更高优先级的线程。即pthread_yield() 导致调用线程放弃 CPU的占用。该线程被放到它的静态优先级运行队列的末尾且其它线程被调度运行。

int sched_yield(void);

sched_yield()在成功完成之后返回零。否则,返回-1 ,并设置errno以指示错误状态。
ENOSYS: 本实现不支持sched_yield。

Linux 系统里,这个调用是成功的(但是可移植的和为将来计算的应用还是要处理这个可能的错误返回)。 注意这个调用不是标准的,但在许多其它系统也存在。可以使用标准的 sched_yield(2) 来代替。对于sched_yield(2)需要注意,如果调用者线程为当前仅有的优先级最高的线程,则在调用该函数后回继续运行。

设置/获取线程优先级

int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param)

pthread_setschedparam(3C) 修改现有线程的优先级。此函数对于调度策略不起作用。线程的调度有三种策略:SCHED_OTHERSCHED_RRSCHED_FIFO。Policy用于指明使用哪种策略。

pthread_setschedparam()在成功完成之后返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况,pthread_setschedparam()函数将失败并返回相应的值。
EINVAL: 所设置属性的值无效。
ENOTSUP: 尝试将该属性设置为不受支持的值。

int pthread_getschedparam(pthread_t tid, int policy,struct schedparam *param );

pthread_getschedparam(3C) 可用来获取现有线程的优先级。

pthread_getschedparam()在成功完成之后返回零。其他任何返回值都表示出现了错误。如果出现以下情况,该函数将失败并返回对应的值。
ESRCH: tid指定的值不引用现有的线程。

向线程发送信号

int pthread_kill(pthread_t thread, int sig);

pthread_kill() 将信号sig发送到由tid指定的线程。thread所指定的线程必须与调用线程在同一个进程中。sig参数必须来自signal(5) 提供的列表。如果sig为零,将执行错误检查,但并不实际发送信号。此错误检查可用来检查thread的有效性。

pthread_kill() 在成功完成之后返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况,pthread_kill() 将失败并返回相应的值。
EINVAL: sig是无效的信号量。
ESRCH: 当前的进程中找不到tid。

访问/设置调用线程的信号掩码

int pthread_sigmask(int how , const sigset_t * new , sigset_t * old);
  • SIG_BLOCK。向当前的信号掩码中添加new ,其中new 表示要阻塞的信号组。
  • SIG_UNBLOCK。从当前的信号掩码中删除new ,其中new 表示要取消阻塞的信号组。
  • SIG_SETMASK。将当前的信号掩码替换为new ,其中new 表示新的信号掩码。

当new 的值为NULL 时,how 的值没有意义,线程的信号掩码不发生变化。要查询当前已阻塞的信号,请将NULL 值赋给new 参数。除非old变量为NULL ,否则old指向用来存储以前的信号掩码的空间。

pthread_sigmask返回值
pthread_sigmask()在成功完成之后返回0。其他任何返回值都表示出现了错误。如果出现以下情况,pthread_sigmask()将失败并返回相应的值。
EINVAL: 未定义how 的值。

线程终止

void pthread_exit(void *status);

作用:调用线程将终止,退出状态设置为status 的内容

pthread_exit() 函数可用来终止调用线程。将释放所有线程特定数据绑定。如果调用线程尚未分离,则线程ID和status 指定的退出状态将保持不变,直到应用程序调用pthread_join() 以等待该线程。否则,将忽略status。线程ID可以立即回收。

有一个重要的特殊情况,即当初始线程(即调用main() 的线程)从main() 调用返回时或调用exit() 时,整个进程及其所有的线程将终止。因此,一定要确保初始线程不会从main() 过早地返回。

请注意,如果主线程仅仅调用了pthread_exit ,则仅主线程本身终止。进程及进程内的其他线程将继续存在。所有线程都已终止时,进程也将终止。

  评论这张
 
阅读(1334)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018