POSIX线程
简称Pthreads,是线程POSIX标准。该标准定义了创建和操作线程的一整套API。在类UNIX操作系统中,都使用Pthreads作为操作系统的线程。
API
Pthreads的API函数可以非正式的划分为三大类:
- 线程管理(Thread Management):直接用于线程创建,分离,连接等。包含了用于设置和查询线程属性(可连接,调度属性等)
- 互斥量(mutex):用于线程同步,称为互斥量。Mutex函数提供了创建,销毁,锁定和解锁互斥量的功能,同时还包括了一些用于设定或修改互斥量属性的函数
- 条件变量(condition variables):处理共享一个互斥量的线程间通信,基于程序员指定的条件。这类函数包含执行的条件变量的创建,销毁,等待和受信(signal)
- 命名约定:线程库中所有标识符否已pthread开头
Routine Prefix | Functional Group |
---|---|
pthread_ | 线程本身和各种相关函数 |
pthread_attr_ | 线程属性对象 |
pthread_mutex_ | 互斥量 |
pthread_mutexattr_ | 互斥量属性对象 |
pthread_cond_ | 条件变量 |
pthread_condattr_ | 条件变量属性对象 |
pthread_key_ | 线程数据键(Thread-specific data keys) |
创建、终止线程
1 |
|
线程同步
1 |
|
生产者消费者线程
1 |
|
pthread_join和pthread_detach
https://blog.csdn.net/weibo1230123/article/details/81410241
- linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态,如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。
- unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己, 如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为 joinable,然后适时调用pthread_join.
- 简单的说就是在线程函数头加上 pthread_detach(pthread_self())的话,线程状态改变,在函数尾部直接 pthread_exit线程就会自动退出。省去了给线程擦屁股的麻烦。
pthread_join
将子线程合并进入主线程,主线程阻塞等待子线程结束,然后收回子线程资源。pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数(pthread_create中指定的线程func)返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
pthread_detach
将子线程与主线程分离,子线程结束后,资源自动回收。
pthread_join()函数的替代函数,可回收创建时detachstate属性设置为PTHREAD_CREATE_JOINABLE的线程的存储空间。该函数不会阻塞父线程。
通常是主线程使用pthread_create()创建子线程以后,一般可以调用pthread_detach(threadid)分离刚刚创建的子线程。