您的位置:首页 > 编程语言

POSIX 线程编程小结

2016-04-09 13:12 381 查看

The Pthreads API

Pthreads API可以非正式地分为以下四组:

线程管理:

互斥:

条件变量:

同步:

线程管理

API:

#include <pthread.h>
int pthread_create(pthread_t *thread, pthread_attr_t *attr,
void *(*start_routine)(void*), void *arg);
void pthread_exit(void *value_ptr);
int pthread_cancel(pthread_t thread);
int pthread_attr_destroy(pthread_attr_t *attr);
int pthread_attr_init(pthread_attr_t *attr);


创建线程:

最初main程序由一个默认线程组成,其他线程必须显示地创建

pthread_create创建一个线程然后执行,可以在代码中的任意地方调用

pthread_create的参数

thread:返回新创建线程的独一无二的标识符

attr:用于设定线程属性的属性对象,NULL为默认值

start_routine: 需要线程执行的例程(函数的入口地址,也就是函数的指针)

arg: 传递给start_routine例程的参数,类型为void*

一个进程可创建的最大线程数是由不同操作系统决定的

ulimit -a

线程属性(thread attribute object):

默认情况下,被创建的线程带有一种属性。我们可以用属性对象来改变线程的属性。

pthread_attr_init 和 pthread_attr_destroy 用于初始化/销毁线程属性。

其他例程用于设定或查询线性属性,其中包括:

Detached or joinable state

Scheduling inheritance

Scheduling policy

Scheduling parameters

Scheduling contention scope

Stack size

Stack address

Stack guard (overflow) size

线程绑定和调度

终止线程

有多种方法来终止线程

从start_routine正常返回

线程调用pthread_exit

线性调用pthread_cancel来终止其他线程

调用exec() 或exit() 来结束整个进程

main() 结束

pthread_exit() 允许指定一个终止状态码

pthread_exit() 并不关闭打开的文件

加入(Joining) 和 分离(Detaching) 线程

API:

int pthread_join(pthread_t threadid, void **value_ptr);
int pthread_detach(pthread_t thread);
int pthread_attr_getdetachstate(pthread_attr_t *attr,
int *detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr,
int detachstate);


Joining:

pthread_join()例程阻塞调用线程,直到指定的线程标识为threadid的线程终止

pthread_join()可以获得目标线程的终止状态

如果调用pthread_join()被canceled,那么目标进程就不会被分离

同时对同一个目标线程调用pthread_join()的结果是未定义的

如果pthread_join()成功返回,实现目标线程的资源将被回收,例如线程栈空间

Detaching

pthread_detach()可以使目标线程进入分离状态

进入分离状态的线程在终止时会自动回收线程资源

栈管理

API:

int pthread_attr_getstacksize(pthread_attr_t *attr,
size_t *stacksize);
int pthread_attr_setstacksize(pthread_attr_t *attr,
size_t stacksize);
int pthread_attr_getstackaddr(pthread_attr_t *attr,
void **restrict stackaddr);
int pthread_attr_setstackaddr(pthread_attr_t *attr,
void *stackaddr);


互斥量(Mutex Variables)

API:

int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t *attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int pthread_mutexattr_init(pthread_mutexattr_t *attr);


使用:

互斥量使用之前必须初始化,有两种方法进行初始化

静态声明时 pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;

动态分配 pthread_mutex_init()

attr目标用于去建立互斥锁的属性,Pthreads标准定义了三个属性:

Process-shared:

Protocol

Prioceiling

pthread_mutexattr_init() 和 pthread_mutexattr_destroy()用于创建和销毁互斥锁属性

Locking 与 Unlocking 互斥锁:

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);


pthread_mutex_unlock()会返回错误如果当前进程没有获得这把锁或者这把锁已经unlock

条件变量(Condition Variables)

API:

int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_init(pthread_cond_t* cond,pthread_condattr_t *attr);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_condattr_destroy(pthread_condattr_t *attr);
int pthread_condattr_init(pthread_condattr_t *attr);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: