Posix线程编程API简介

来源:互联网 发布:linux命令解释 编辑:程序博客网 时间:2024/05/18 00:45
原文:http://baike.baidu.com/view/974776.htm
http://zh.wikipedia.org/wiki/POSIX
http://www.blogjava.net/tinysun/archive/2010/05/29/322210.html
一、简介
  POSIX thread 称为Posix线程,简称为pthread,Posix线程是指一个POSIX标准线程.
POSIX是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。
Linux基本上逐步实现了POSIX兼容,但并没有参加正式的POSIX认证。微软的Windows NT声称部分实现了POSIX标准。.
  pthreads定义了一套 C程序语言类型、函数与常量,它以 pthread.h 头文件和一个线程库
二、数据类型
pthread_t:线程句柄
pthread_attr_t:线程属性
pthread_t类型定义

  typedef unsigned long int pthread_t;
  //come from /usr/include/bits/pthread.h

用途:pthread_t用于声明线程ID。
其他:sizeof (pthread_t) =4;
三、线程操纵函数
 pthread_create():创建一个线程.更多内容请阅读《pthread_create简介
 pthread_exit():终止当前线程.更多内容请阅读《pthread_exit简介
 pthread_cancel():中断另外一个线程的运行.
   示例1:

pthread_t thr; void *res; pthread_create(&thr, NULL, thread_start, NULL); sleep(2); /* Allow new thread to run a while */ pthread_cancel(thr) pthread_join(thr, &res); if(res == PTHREAD_CANCELED) printf("Thread was canceled; cnt = %d\n", cnt); else printf("Thread terminated normally; cnt = %d\n", cnt); exit(EXIT_SUCCESS);;

int pthread_join(pthread_t thread, void **retval);:阻塞当前的线程,直到另外一个线程运行结束。其使用请参照示例1。更多内容请阅读pthread_exit简介
int pthread_attr_init(pthread_attr_t *attr);:初始化线程的属性.关于线程的属性请参考《线程属性pthread_attr_t简介
int pthread_attr_destroy(pthread_attr_t *attr);:销毁一个线程属性pthread_attr_t,并且使它在重新初始化之前不能重新使用。
int pthread_kill(pthread_t thread, int sig);:向线程发送一个信号.请在创建的线程中使用signal函数来设置信号的处理函数,比如想把信号SIGKILL的处理函数设置为sig_handler可以这样写signal(SIGKILL,sig_handler)。另外注意。如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出。关于信号signal处理机制的详细内容请阅读《Linux 信号signal处理机制
四、同步函数
以下函数通过mutex 条件变量来实现线程的同步
pthread_mutex_init() 初始化互斥锁
pthread_mutex_destroy() 删除互斥锁
pthread_mutex_lock():占有互斥锁(阻塞操作)
pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
pthread_mutex_unlock(): 释放互斥锁
pthread_cond_init():初始化条件变量
pthread_cond_destroy():销毁条件变量
pthread_cond_signal(): 唤醒第一个在该条件变量上调用pthread_cond_wait()而进入睡眠的线程
pthread_cond_broadcast():尝试唤醒所有在该条件变量上调用pthread_cond_wait()而进入睡眠的线程
pthread_cond_wait(): 等待条件变量的特殊条件发生。
更多内容请阅读《pthread_cond_signal和pthread_cond_wait简介》和《各种Mutex(互斥量)的区别
五、线程特有数据
以下函数用于实现线程特有数据(Thread-local storage)
pthread_key_create(): 分配用于标识进程中线程特定数据的键
pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定
pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
pthread_key_delete(): 销毁现有线程特定数据键
关于此的更多内容请阅读《Posix线程私有数据
六、工具函数
  int pthread_equal(pthread_t threadid1, pthread_t thread2)  判断两个线程ID是否相等,返回0 不相等,非零相等。
  pthread_detach(): 分离线程.关于此的更多内容请参考《线程属性pthread_attr_t简介
  pthread_self(): 获取线程自身ID(标识号)
  在线程中,线程ID的类型是pthread_t类型,由于在Linux下线程采用POSIX标准,所以,在不同的系统下,pthread_t的类型是不同的,比如在ubuntn下,是unsigned long类型,而在solaris系统中,是unsigned int类型。而在FreeBSD上才用的是结构题指针。 所以不能直接使用==判读,而应该使用pthread_equal来判断。
原创粉丝点击