1.建立线程
对于线程的操作都是通过pthread_t类型的线程ID来实现的。
创建线程
int
pthread_create(pthread_t
*
thread,
const
pthread_attr_t
*
attr,
void
*
(
*
start)(
void
*
),
void
*
arg)
thread返回创建的线程的ID
attr用于设置线程的属性,一般设置为NULL,即使用默认属性
线程起始则是通过第三个函数指针来指示,函数的参数为void *,返回值为void *
arg可以为线程传递参数
当前线程调用pthread_create和新的线程被执行不存在同步关系,也就是说新线程在pthread_create未返回前可能已经运行甚至结束。
main函数可以看做是一种特殊的线程,一般称为主线程或者初始线程。
初始线程与普通线程的区别
1.接收的参数是不同的,初始线程为(int argc,char *argv[]),而普通线程为(void *)
2.初始线程继承UNIX进程的特性,从初始线程返回时,同时会终止所有其他线程,而普通线程不会影响其他线程。
3.初始线程一般使用的进程的堆栈,一般是可增长的足够尺寸,普通线程的堆栈一般是有限制的,可能会导致栈溢出。
main函数作为特殊的线程也可以使用pthread_cancle,pthread_join等函数,若希望初始线程退出时,其他线程继续运行,可以通过调用pthread_exit()函数。
2.线程的取消
int
pthread_cancle(pthread_t thread)
3.线程的链接
int
pthread_join(pthread_t thread,
void
*
*value_ptr)
4.线程的分离
int
pthread_detach(pthread_t thread)
5.线程的退出
void
pthread_exit(
void
*value_ptr)
以上返回值
0:成功
其他:错误编号
6.线程的四种基本状态
就绪状态
运行状态
阻塞状态
- 试图加锁一个已经被锁住的互斥量
- 等待某个条件变量
- 调用singwait等待某个尚未发生的信号
- 执行无法立即完成的读写操作
- 由于系统内存页出错的问题而阻塞
终止状态
- 线程从启动函数返回
- 线程调用phtread_exit函数
- 线程自身调用pthread_cancle函数或者其他线程调用pthread_cancle函数
从启动函数或者pthread_exit函数返回与调用pthread_cancle外部区别在于,pthread_cancle返回值为PHTREAD_CANCLED
调用pthread_cancle和pthread_exit函数到终止状态前,线程会调用清理函数做些清理,清理过程通过pthread_cleanup_push注册,pthread_cleanup_pop删除。
线程的取消(终止线程)
7.线程的回收
线程达到终止状态时,有些资源不会被回收,例如线程的返回值,线程ID等
分离不会影响正在运行的线程,只是通知操作系统在线程结束时,可以回收线程资源。
一种比较特殊的是进程直接退出,例如main函数退出
线程分离属性,可以通过以下方式实现,
- 创建线程时指定线程属性为可分离
- 调用phtread_detach函数
- 调用pthread_join函数
线程到达终止状态时并且为可分离时,系统会立即回收线程资源,如线程堆栈,保存寄存器的和返回值的内存空间等。
否则线程会一直处于终止状态到被分离的状态。