快速业务通道

pthread线程库简介

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-03-29
得到线程的退出状态.如果线程调用ptread_exit((void *2)),那么pthread_join依然可以得到退出状态2.这个指针可以是复杂的结构类型以便保存更多信息.

int pthread_join(pthread_t thread, void **rval_ptr);

/* 成功返回0,否则返回错误编号 */

调用pthread_join的线程将被阻塞,直到指定的线程(thread)调用pthread_exit,从启动函数或者被取消.另外,void *rval_ptr可以作为一个int直接返回.例如return (void *)1;或者pthread_exit((void *)1);那么从pthread_join获得该指针直接可以用(int)ptr来输出.

这个void *rval_ptr指向的内存地址不应该在栈上,其内容会被下面调用的函数覆盖.应该是在堆上(通过malloc来创建)或者在静态数据段(用静态,全局变量).

int pthread_cancel(pthread_t tid);

/* 成功返回0,否则返回错误编号 */

行为相等于参数值等同于PTHREAD_CANCELED的pthread_exit函数.

注意:线程可以自行选择忽略取消或者控制取消方式.注意pthread_cancel并不等待线程终止,仅仅是提出请求.

线程可以自己安排退出时需要执行的函数,这与进程atexit函数安排退出时要执行的函数是类似的.这样的函数称为线程清理处理程序.线程可以建立多个线程处理函数,存放在栈中,执行顺序与他们注册的顺序相反.

void pthread_cleanup_push(void (*rtn)(void *), void *arg);

void pthread_cleanup_pop(int execute);

pthread_cleanup_pop删除上一次注册的线程清理处理程序.如果execute非0,则执行这个程序.

关于参数的使用方法的一个例子:

  1. void
  2. cleanup(void *arg)
  3. {
  4. printf("cleanup: %s\n", (char *)arg);
  5. }
  6. void
  7. thr_fn1(void *arg)
  8. {
  9. /* ... */
  10. pthread_cleanup_push(cleanup, "first cleanup in Thread ");
  11. pthread_cleanup_push(cleanup, "second cleanup in Thread ");
  12. /* ... */
  13. pthread_cleanup_pop(0);
  14. pthread_cleanup_pop(0);
  15. return ((void *)1);/* 通过返回终止线程的话,清理处理程序就不会调用 */
  16. /* or pthread_exit((void *)2); 通过pthread_exit就会正常调用 */
  17. }
  18. int
  19. main(void)
  20. {
  21. /* ... */
  22. err = pthread_create(&tid, NULL, thr_fn1, (void *)1);
  23. if (err != 0)
  24. /* print err and quit*/
  25. /* ... */
  26. err = pthread_join(tid1, &tret);
  27. if (err != 0)
  28. /* print err and quit*/
  29. /* ... */
  30. return 0;
  31. }

参考:

APUE

ULK

fork vfork clone pthread_create http://blog.csdn.net/sandflee/article/details/5189312

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号