原文:
http://baike.baidu.com/view/974776.htm
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_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_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(): 等待条件变量的特殊条件发生。
五、线程特有数据
以下函数用于实现线程特有数据(
Thread-local storage
)
pthread_key_create(): 分配用于标识进程中线程特定数据的键
pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定
pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
pthread_key_delete(): 销毁现有线程特定数据键
六、工具函数
int
pthread_equal(pthread_t threadid1, pthread_t thread2) 判断两个线程ID是否相等,返回0 不相等,非零相等。
pthread_self(): 获取线程自身ID(标识号)
在线程中,线程ID的类型是pthread_t类型,由于在Linux下线程采用POSIX标准,所以,在不同的系统下,pthread_t的类型是不同的,比如在ubuntn下,是unsigned long类型,而在solaris系统中,是unsigned int类型。而在FreeBSD上才用的是结构题指针。 所以不能直接使用==判读,而应该使用pthread_equal来判断。