操作系统 Linux下 同步与互斥的实现教程
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);
发表评论