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 函数

pthread_exit
pthread_self


3. pthread_join / pthread_cancel 函数

pthread_join
pthread_cancel


4. 进程库和线程库的函数比较

功能进程库线程库
标志类型pid_tthread_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):线程直接和”系统范围“内的其它线程竞争;

三种线程模型:

N:1用户线程模型
1:1核心线程模型
N:M混合线程模型


6. 线程特定数据(TSD)

  • 在单线程程序中,使用"全局变量"以实现多个函数间共享数据;
  • 在多线程环境下,由于数据空间是共享的,因此全局变量也为所有线程所共用;
  • 有时应用程序设计中有必要提供线程私有的全局变量,仅在某个线程中有效,但却可以跨多个函数访问;
  • POSIX线程库通过维护一定的数据结构来解决这个问题,这些数据称为(Thread_specific Data,或TSD);

使用线程特定数据的相关库函数有:pthread_key_create()pthread_setspecific()pthread_getspecific()还有pthread_once(),详情见man 3 xxx

以上是关于POSIX线程库:pthreads的主要内容,如果未能解决你的问题,请参考以下文章

Pthread 库实际上是用户线程解决方案吗?

Linux posix线程库总结

C++封装POSIX 线程库线程的封装

读者线程没有退出 - Posix Pthreads

pthread

POSIX 信号量和 pthread 问题