免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1406 | 回复: 0
打印 上一主题 下一主题

线程相关函数笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-30 22:55 |只看该作者 |倒序浏览
1. 比较两个线程 ID 是否一致。
   线程ID 使用 pthread_t 数据类型来表示。Linux 使用 unsigned long int 表示pthread_t 数据类型。Solaris 9 把 pthread_t 数据类型表示为 unsigned int。FreeBSD5.2.1 和 MAC OS X 10.3 用一个指向 pthread 结构的指针来表示pthread_t 数据类型。 因此如果需要考虑移植性,必须使用函数来对两个线程ID进行比较。

#include pthread.h>
int pthread_equal(pthread_t tid1, pthread_t tid2);
                                       返回值:如果相等返回非0,否则返回0
2.获取线程自身的线程ID。
#include pthread.h>
pthread_t pthread_self(void);
                                       返回值:调用线程的线程ID
3.创建线程:
#include pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg);
                             返回值:若成功返回0;如果失败,返回错误编号
4.线程终止
    如果进程中的任一线程调用了 exit,_Exit或者 _exit 函数,那么整个进程就会退出。与此类似,如果信号的默认动作是终止进程,那么,把该信号发送到线程会终止整个进程。
    在不终止整个进程的情况下,单个线程可以通过下列三种方式退出:
1)线程只是从启动例程中返回,返回值作为线程的退出码。
2)线程可以被同一进程中的其他线程取消。
3)线程调用 pthread_exit。
#include pthread.h>
                   void pthread_exit(void *rval_ptr);
    进程中的其他线程可以通过调用 pthread_join 函数访问到这个指针。
#include pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);
                                          返回值: 若成功返回0,失败返回错误编号
调用这个函数后,调用线程将一直阻塞,直到指定的线程以前面提到的3种方式退出,即:
1)线程只是从启动例程中返回,返回值作为线程的退出码。
2)线程可以被同一进程中的其他线程取消。
3)线程调用 pthread_exit。
   如果线程只是从它的启动例程中返回, rval_ptr将包含返回码。如果线程被取消,由rval_ptr 指定的内存单元就置为 PTHREAD_CANCELED。
   如果线程已经处于分离状态, pthread_join 调用就会失败,返回 EINVAL。
   如果 rval_ptr 为 NULL,则调用pthread_join 函数将等待指定的线程终止,但是并不获取线程的终止状态。

5.请求取消同一进程中的其他线程
#include pthread.h>
int pthread_cancel(pthread_t tid);
                                 返回值:若成功则返回0,否则返回错误编号
    在默认情况下,pthread_cancel 函数会使得由 tid 标识的线程的行为表现为如同调用了参数为 PTHREAD_CANCELD的pthread_exit函数,但是,线程可以选择忽略取消方式或者是控制取消方式。注意,pthread_cancel并不等待线程终止,它仅仅是提出请求。
    线程可以安排它退出时需要调用的函数,这与进程可以用 atexit 函数安排进程退出时需要调用的函数是类似的。这样的函数称为:线程清理处理程序(thread cleanup handler)。线程可以建立多个清理处理程序。处理程序记录在栈中,也就是说他们的执行顺序与他们注册时的顺序相反。
#include pthread.h>
void pthread_cleanup_push(void (*rtn)(void *), void *arg);
void pthread_cleanup_pop(int execute);
   当线程执行以下动作时调用清理函数,调用参数为arg,清理函数 rtn 的调用顺序是由pthread_cleanup_push 函数来安排的。
1)调用pthread_exit时。
2)响应取消请求时。
3)用非零 execute参数调用 pthread_cleanup_pop 时。
如果execute 参数为0,清理函数将不被调用。无论是否为0,pthread_cleanup_pop都将删除上次 pthread_cleanup_push 调用建立的清理处理程序。
注意:
1)如果线程是通过从它的启动例程中返回而终止的话(例如通过return函数),那么它的清理处理程序就不会被调用。
2)清理处理程序是按照与他们安装时相反的顺序被调用的。
3)这些函数有一个限制,由于他们可以实现为宏,所以必须在与线程相同的作用域中以匹配对的形式使用,否则,程序编译可能通不过。pthread_cleanup_push 的宏定义可包含字符{,在这种情况下,对应的匹配字符 } 就要在 pthread_cleanup_pop 定义中出现。

6. pthread_detach 函数。
在默认情况下,线程的终止状态会保存到对该线程调用 pthread_join,如果线程已经处于分离状态,线程的底层存储资源可以在线程终止时立即被收回。对分离状态的线程进行 pthread_join 的调用会产生失败,返回 EINVAL。pthread_detach 调用可以用于使线程进入分离状态。

#include pthread.h>
int pthread_detach(pthread_t tid);
                                   返回值:若成功返回0,失败返回错误编号

7.进程原语和线程原语的比较
进程原语         线程原语                       描述
fork            pthread_create               创建新的控制流
exit            pthread_exit                 从现有的控制流中退出
waitpid         pthread_join                 从控制流中得到退出状态
atexit          pthread_cancel_push          注册在退出控制流时调用的函数
getpid          pthread_self                 获取控制流的ID
abort           pthread_cancel               请求控制流的非正常退出



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/105349/showart_2135965.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP