POSIX线程库:pthreads
Posted 清水寺扫地僧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POSIX线程库:pthreads相关的知识,希望对你有一定的参考价值。
文章目录
- 与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以"pthread_"打头的;
- 要使用这些函数库,要通过引入头文件
<pthread.h>
; - 链接这些线程函数库时要使用编译器命令的"
-lpthread
"选项;
1. pthread_create 函数
功能:创建一个新的线程
原型:
int pthread_create
(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);
参数:
thread:返回线程ID;
attr:设置线程的属性,传入参数,attr为NULL表示使用默认属性;
start_routine:是个函数地址,线程启动后要执行的函数;
arg:传给线程启动函数的参数,
在网络I/O当中,尽量使用右值传递而不是左值传递,防止时间片没轮上导致左值已更改的情形,
因为满足竞态条件(race condition);
返回值:成功返回0;失败返回错误码,对于pthread错误检查:
- 传统的函数是,成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误;
- pthreads函数出错时不会设置errno(而大部分其它POSIX函数会这样做)。而是将错误代码通过返回值返回;
- pthreads同样也提供了线程内的errno变量,以支持其他使用errno的代码。对于pthreads函数的错误,建议通过返回值来判定,因为读取返回值要比读取线程内的errno变量的开销更小;
2. pthread_exit / pthread_self 函数
|
|
3. pthread_join / pthread_cancel 函数
|
|
4. 进程库和线程库的函数比较
功能 | 进程库 | 线程库 |
---|---|---|
标志类型 | pid_t | thread_t |
创建 | fork() | phtread_create() |
僵尸进/线程回收 | wait() / waitpid() | pthread_join() pthread_detach() |
自杀,自身终止/退出 | 在进程中调用exit() 在main函数中调用return | 在线程入口函数中调用pthread_exit() 在线程入口函数中调用return |
他杀,杀死另外的进/线程 | kill() | pthread_cancel() |
5. 线程属性、线程模型、线程调度竞争范围
|
|
|
|
关于右上图中的内容,涉及到线程调度竞争范围:
- 操作系统提供了各种模型,用来调度应用程序创建的线程。这些模型之间的主要不同是:在竞争系统资源(特别是CPU时间)时,线程调度竞争范围(thread-scheduling contention scope)不同;
- 进程竞争范围(process contention scope):各个线程在同一进程竞争”被调度的CPU时间“(但不直接和其它进程中的线程竞争);
- 系统竞争范围(system contention scope):线程直接和”系统范围“内的其它线程竞争;
三种线程模型:
|
|
|
6. 线程特定数据(TSD)
- 在单线程程序中,使用"全局变量"以实现多个函数间共享数据;
- 在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共用;
- 有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问;
- POSIX线程库通过维护一定的数据结构来解决这个问题,这些数据称为(Thread_specific Data,或TSD);
使用线程特定数据的相关库函数有:pthread_key_create()
,pthread_setspecific()
,pthread_getspecific()
还有pthread_once()
,详情见man 3 xxx
;
以上是关于POSIX线程库:pthreads的主要内容,如果未能解决你的问题,请参考以下文章