头文件:
线程操作
创建线程
int pthread_create(pthread_t * thread, const pthread_arrt_t* attr,void*(*start_routine)(void *), void* arg);
- thread参数是新线程的标识符,为一个整型。
- attr参数用于设置新线程的属性。给传递NULL表示设置为默认线程属性。
- start_routine和arg参数分别指定新线程将运行的函数和参数。start_routine返回时,这个线程就退出了
- 返回值:成功返回0,失败返回错误号。
线程id的类型是thread_t,它只在当前进程中保证是唯一的,在不同的系统中thread_t这个类型有不同的实现,调用pthread_self()可以获得当前线程的id。
进程id的类型时pid_t,每个进程的id在整个系统中是唯一的,调用getpid()可以获得当前进程的id,是一个正整数值。
终止线程
线程函数return
线程的函数执行到return,线程也就随着结束了
pthread_cancel
int pthread_cancel(pthread_t thread);
- thread参数是目标线程的标识符。
- 该函数成功返回0,失败返回错误码。
pthread_exit
void pthread_exit(void * retval);
- retval是void *类型,其它线程可以调用pthread_join获得这个指针。需要注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是由malloc分 配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。
- pthread_exit函数通过retval参数向线程的回收者传递其退出信息。它执行之后不会返回到调用者,且永远不会失败。
线程等待
void pthread_join(pthread_t thread,void ** retval);
- 调用该函数的线程将挂起等待,直到id为thread的线程终止。
- thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的。
分离线程
线程有两种状态,分别是
- 可结合的(joinable)
- 可分离的(detached)
默认线程都是可结合的,如果在线程结束的时候没有被join函数调用,那么这个线程的部分资源(堆栈和线程描述符)就没有被系统回收。如果线程是可分离的,那么在线程结束时资源会被回收。
int pthread_detach(pthread_t tid);
在使用的时候可以在主函数中pthreqd_detach(pid)
或者直接在线程的函数中使用pthread_detach(pthread_self())
互斥
To be Continue…
函数列表
操作函数
- pthread_create():创建一个线程
- pthread_exit():终止当前线程
- pthread_cancel():中断另外一个线程的运行
- pthread_join():阻塞当前的线程,直到另外一个线程运行结束
- pthread_attr_init():初始化线程的属性
- pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
- pthread_attr_getdetachstate():获取脱离状态的属性
- pthread_attr_destroy():删除线程的属性
- pthread_kill():向线程发送一个信号
同步函数
用于 mutex 和条件变量
- pthread_mutex_init() 初始化互斥锁
- pthread_mutex_destroy() 删除互斥锁
- pthread_mutex_lock():占有互斥锁(阻塞操作)
- pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
- pthread_mutex_unlock(): 释放互斥锁
- pthread_cond_init():初始化条件变量
- pthread_cond_destroy():销毁条件变量
- pthread_cond_signal(): 唤醒第一个调用
- pthread_cond_wait()而进入睡眠的线程
- pthread_cond_wait(): 等待条件变量的特殊条件发生
Thread-local storage(或者以Pthreads术语,称作线程特有数据) - pthread_key_create(): 分配用于标识进程中线程特定数据的键
- pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定
- pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
- pthread_key_delete(): 销毁现有线程特定数据键
- pthread_attr_getschedparam();获取线程优先级
- pthread_attr_setschedparam();设置线程优先级
工具函数
- pthread_equal(): 对两个线程的线程标识号进行比较
- pthread_detach(): 分离线程
- pthread_self(): 查询线程自身线程标识号