讨论的线程接口来自POSIX标准,头文件#include <pthread.h>
线程标识
pthread_t //线程ID
int pthread_equal(pthread_t tid1, pthread_t tid2);//两个线程ID比较,返回值:若相等则返回非0值,否则返回0
pthread_t pthread_self(void);//获取自身的线程ID
线程创建
函数原型:
int pthread_create(thread_t *thread,const pthread_attr_t *attr,void *(start_routine)(void*),void *arg);
返回值:若成功返回零,不成功返回错误编号
参数说明:
thread: 指向线程标识符的指针(可以在线程运行过程中用pthread_self获得)。
attr: 用来设置线程属性。NULL 默认值
start_routine: 线程运行函数的起始地址。
arg: 运行函数的参数。
线程终止
(1)线程从启动例程中返回,在不终止整个进程的境况下停止它的控制流
(2)线程可以被同一进程中的其他线程取消pthread_cancel(pthread_t tid)
(3)线程调用pthread_exit(void *rval_ptr)
pthread_join(pthread_t thread, void **ptr)
调用线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程中返回或者被取消。如果线程被取消,由rval_ptr指定的内存单元为PTHREAD_CANCELED。
如果线程已经处于分离状态,pthread_join调用失败,返回EINVAL。
pthread_cancel(pthread_t tid)
不等待线程终止,它仅仅提出请求。
线程清理函数
void pthread_cleanup_push(void (*rtn)(void *), void *arg);
void pthread_cleanup_pop(int execute);
执行顺序与它们注册的顺序相反 ,
pthread_cleanup_push 执行
调用pthread_exit时、响应取消请求时、用非零execute参数调用pthread_cleanup_pop时
如果execute 参数值为0,清理函数不被调用。
进程原语和线程原语的比较
进程原语 | 线程原语 | 描述 |
fork | pthread_create | 创建新的控制流 |
exit | pthread_exit | 从现在的控制流中退出 |
waitpid | pthread_join | 从控制流中得到退出状态 |
atexit | pthread_cleanup_push | 注册在退出控制流时调用的函数 |
getpid | pthread_self | 获取控制流的ID |
abort | pthread_cencel | 请求控制流的非正常退出 |
线程同步