Pthreads API解析
Pthread线程API可以分为四大类
1.线程管理API:包括创建,分离,等待线程的API,以及设置/查询线程属性的API。
2.互斥锁:处理线程的同步,包括互斥器的创建与销毁,加锁与解锁。以及设置与互斥器相关的属性。
3:条件变量:处理线程之间的通信,包括条件变量的创建与销毁,设置查询条件变量的属性。
4.管理读写锁以及barrier
命名约定:线程库中的所有标识符都以pthread_开头 。一些例子如下所示
创建线程
pthread_create参数:
- thread:子程序返回的新线程的唯一标识符。
- attr:可用于设置线程属性的对象。您可以指定一个线程属性对象,或者为默认值指定为NULL。
- start_routine:线程在创建后将执行的C函数。
- arg:可以传递给start_routine的单个参数 。它必须通过void类型的指针传递。如果不传递参数,则可以使用NULL。
线程属性:
- 默认情况下,创建一个具有某些属性的线程。这些属性中的一些可以由程序员通过线程属性对象来更改。
- pthread_attr_init和pthread_attr_destroy用于初始化/销毁线程属性对象。
- 然后使用其他例程查询/设置线程属性对象中的特定属性。属性包括:
- 分离状态或等待状态
- 计划继承
- 计划政策
- 计划参数
- 安排争用范围
- 堆栈大小
- 堆栈地址
- 堆栈保护(溢出)大小
- 其中一些属性将在后面讨论
终止线程&pthread_exit():
- 线程可以被终止的几种方式:
- 线程从其起始函数正常返回。它的工作已经完成了。
- 线程调用pthread_exit子程序 - 无论其工作是否完成。
- 线程被另一个线程通过pthread_cancel 例程取消。
- 整个进程由于调用exec()或者exit()终止
- 如果main()首先完成,不需要 自己 调用pthread_exit
在正常执行完成的子程序中,您通常可以省去调用pthread_exit() - 除非当然要将可选状态代码传回。
pthread_exit()例程不关闭文件; 在线程终止之后,线程内部打开的任何文件将保持打开状态。
如果main()最后显示调用l pthread_exit() ,那么main线程将会阻塞,知道他所创建的线程都完成。
等待以及分离线程(join detach)
join是完成线程同步的一种方法
调用pthread_join将一直等待知道线程结束。
连续调用两次该函数将引发不明确的行为
两个其他的同步手段互斥器以及条件变量将在后文讨论。