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);
相关文章推荐
- Spring参考指南
- 我爱学Java之接口和抽象类
- 关于Java SE出现报错Exception in thread "main" java.lang.Error: Unresolved compilation problems...
- filter 、map 、reduse、sorted 作用、特性及实例
- 导入java项目
- C# winform窗体间传值(使用委托或事件)
- IDEA插件配置之Eclipse Code Formatter
- 结对编程项目——电梯调度
- java动态数组 2.0
- 关于hibernate的 Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
- java动态数组
- 第四次程序设计作业 C++计算器计算及命令行的使用 前缀表达式方法实现
- java中volatile关键字的含义
- java用NLPIR对本地txt进行分词,并将分词结果写入本地
- java项目、包、类
- lua编译环境搭建
- C语言之内存对齐
- C#打印小票自带条形码打印
- lambdaj工具类中的 Lambda.maxFrom方法的实现
- 安装eclipse并汉化