编辑: sunny爹 2016-03-03

pthread.h'

.POSIX 线程函数都 以'

pthread_'

开头.在本章中,我们将介绍一下线程操作函数: POSIX 函数 描述 pthread_cancel 终止另一个线程 pthread_create 创建一个线程 pthread_detach 设置线程以释放资源 pthread_equal 测试两个线程 ID 是否相等 pthread_exit 退出线程,而不退出进程

3 pthread_join 等待一个线程 pthread_self 找出自己的线程 ID 表3.2 POSIX 线程管理函数 3.2.1 创建线程 '

pthread_create'

函数创建一个线程. int pthread_create(pthread_t *restrict thread, const pthread_attr_t* restrict attr, void *(*start_routine)(void *), void *restrict arg);

参数 thread 指向保存线程 ID 的pthread_t 结构.参数 attr 表示一个封装了线程的各种属 性的属性对象,用来配置线程的运行,如果为 NULL,则使新线程具有默认的属性.线程属 性将在后面的 XX 节讨论.第三个参数 start_routine 是线程开始执行的时候调用的函数的 名字.这个函数必须具有以下的格式: void* start_routine(void* arg);

返回的 void 指针将被 pthread_join 函数当做退出状态来处理. 第四个参数 arg 正是传递给 start_routine 函数的参数. POSIX 的pthread_create 函数会使创建的线程自动处于可运行 状态,而不需要一个单独的启动操作. 如果成功,pthread_create 返回 0,如果不成功,pthread_create 返回一个非零的错误码. 下表列出了 pthread_create 的错误形式及相应的错误码 错误 原因 EAGAIN 系统没有创建线程所需的资源,或者创建线 程会超出系统对一个进程中线程总数的限制 EINVAL attr 参数是无效的 EPERM 调用程序没有适当的权限来设定调度策略或 attr 指定的参数 表3.3 pthread_create 的错误形式及相应的错误码 每一个线程可以通过调用函数 pthread_self 得到本线程的 ID (数据结构类型: pthread_t) , 它的形式为: pthread_t pthread_self(void);

由于 pthread_t 可能是一个结构,因此 POSIX 提供了一个函数 pthread_equal 来比较线程 ID 是否相等.这个函数的形式为: int pthread_equal(pthread_t t1, pthread_t t2);

4 两个参数 t1 和t2 是两个线程 ID,如果它们相等,pthread_equal 就返回一个非零值,如果 不相等,则返回 0. 3.2.2 分离(Detach)和接合(Join)线程 POSIX 线程的一个特点是:除非线程是被分离了的,否则在线程退出时,它的资源是不会被 释放的.pthread_detach 函数用来分离线程: int pthread_detach(pthread_t thread);

它设置线程的内部选项来说明线程退出后,其所占有的资源可以被回收.参数 thread 是要 分离的线程的 ID.被分离的的线程退出时不会报告它们的状态.如果函数调用成功, pthread_detach 返回 0,如果不成功,pthread_detach 返回一个非零的错误码.下表列出 了pthread_detach 的错误形式及相应的错误码 错误 原因 EINVAL thread 对应的不是一个可分离的线程. ESRCH 没有 ID 为thread 的线程 表3.4 '

pthread_detach'

的错误形式及相应的错误码 pthread_join 函数可以使调用这个函数的线程等待指定的线程运行完成再继续执行.它的 形式为: int pthread_join(pthread_t thread, void **value_ptr);

参数 thread 为要等待的线程的 ID,参数 value_ptr 为指向返回值的指针提供一个位置,这 个返回值是由目标线程传递给 pthread_exit 或return 的.如果 value_ptr 为NULL,调用 程序就不会对目标线程的返回状态进行检索了.如果函数调用成功,pthread_join 返回 0, 如果不成功,pthread_join 返回一个非零的错误码.下表列出了 pthread_join 的错误形式 及相应的错误码 错误 原因 EINVAL thread 对应的不是一个可接合的线程 ESRCH 没有 ID 为thread 的线程 表3.5 pthread_join 的错误形式及相应的错误码 如果线程没有被分离,并且执行 pthread_join(pthread_self()),那么该线程将被一直挂 起,因为这条语句造成了死锁.有些 POSIX 的实现可以检测到死锁,并迫使 pthread_join 带着错误 EDEADLK 返回,但是,POSIX 并不要求一定要进行这种检测.

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题