Linux线程的基本函数
常用线程函数
- pthread_create 创建一个线程
- pthread_exit 线程自行退出
- pthread_join 其它线程等待某一个线程退出
- pthread_cancel 其它线程强行杀死某一个线程
pthread线程库的使用
在源码中使用头文件 pthread.h
用gcc链接时加上 -lpthread 选项,链接线程库
pthread_create 函数
int pthread_create( pthread_t *thread , const pthread_attr_t *attr, void*(*start_rtn)(void*), void * arg);/* 参数1:产生线程的标识符 参数2:所产生线程的属性,通常设为NULL 参数3:新的线程所执行的函数 参数4:新的线程函数的参数 函数返回值:若线程创建成功则返回0,否则返 回-1. */
pthread_join 函数
int pthread_join( pthread_t thread , void **value_ptr);/* 参数1:等待线程的标识符 参数2:用户定义的指针,用来存储被等待线程的返回值 函数返回值:若执行成功则返回0,失败返回错误号 如果一个线程要等待另一个线程的终止,则使用该函数 */
线程同步与互斥
同步互斥机制提供了三种方法
- 互斥锁
- 条件变量
- 信号量
线程锁
互斥量
- 互斥量使用特定的数据类型:pthread_mutex_t
- 互斥量使用前要初始化,初始化函数:
- pthread_mutex_init
- 互斥量使用结束,要对它进行撤销,撤销函数:
- pthread_mutex_destroy
互斥锁操作相关函数
- pthread_mutex_init: 互斥量初始化
- pthread_mutex_lock: 互斥量加锁
- pthread_mutex_unlock: 释放互斥锁
- pthread_mutex_destroy: 释放互斥锁资源
- 使用互斥锁对临界区进行操作的方法:
- 使用函数pthread_mutex_lock进行加锁
- 临界区操作
- 使用函数pthread_mutex_unlock释放互斥锁
信号量
- 信号量的数据类型为sem_t
- #include
- 相关函数:
- sem_init
- sem_wait
- sem_post
- sem_destroy
sem_init函数
int sem_init ( sem_t *sem, int pshared, unsigned int value);/* 参数1: 待初始化的信号量 参数2: 信号量的类型。如果值为0,表示是当前进程的局部信号量,否则是其它进程可以共享该信号量。 LINUX线程一般不支持进程间共享信号量,该值设为0. 参数3:信号量的初始值。 调用成功时返回0,失败返回-1. */
sem_wait函数
int sem_wait(sem_t * sem);/* 参数: 由sem_init调用初始化的信号量对象的指针 sem的值减1 等待信号量,如果信号量的值大于0,将信号量的值减1,立即返回。如果信号量的值为0,则线程阻塞。相当于P操作。 成功返回0,失败返回-1 */
sem_post函数
int sem_post(sem_t * sem);/* 参数: 由sem_init调用初始化的信号量对象的指针 释放信号量,让信号量的值加1。相当于V操作。 */
sem_destroy函数
int sem_destroy(sem_t * sem);/* 参数: 由sem_init调用初始化的信号量对象的指针 归还自己占据的一切资源。 在清理信号量的时候如果还有线程在等待它,用户就会收到一个错误。 */
信号量使用方法
- 声明一个信号量sem_t my_sem;
- 初始化信号量sem_init(& my_sem,0,1);
- sem_post和sem_wait函数配合使用来达到线程同步
- 释放信号量int sem_destroy (& my_sem);