分类: LINUX
2010-07-16 21:56:58
7.1.1、互斥锁基本通信的原理:
互斥以排他方式防止共享数据被并发修改,互斥锁为一个二元量,状态为开锁(0)和上锁(1),将某个共享资源与特定互斥锁绑定后,对该共享资源的访问操作如下:
① 在访问资源前,首先申请该互斥锁,如果该锁处于开锁状态,则申请到该锁对象, 并立即占有该锁(将其上锁)防止其他的线程访问该资源;如果该互斥锁处于锁定 状态,默认阻塞等待
② 只有锁定该互斥锁的进程才能释放该互斥锁,其他线程的释放操作无效
7.1.2、互斥锁的基本操作
1) 初始化互斥锁
定义互斥锁(全局变量):pthread_mutex_t mutex
格式:extern int pthread_mutex_init(pthread_t *mutex, const pthread_mutexattr_t *mutexattr);
参数一:初始化的互斥锁指针
参数二:NULL 默认值,
使用宏初始化:pthread_mutex_t mutex=PTHREAD_MUTEX_INITEALIZER,
2) 申请互斥锁
上锁操作:
阻塞方式申请:extern int pthread_lock(pthread_mutex_t *mutex);
非阻塞方式申请:extern int pthread_trylock(pthread_mutex_t *mutex);
3) 释放互斥锁
解锁操作:
extern int pthread_unlock(pthread_mutex_t *mutex);
4) 销毁互斥锁
格式:extern int pthread_mutex_destroy(pthread_t *mutex);
参数一:初始化的互斥锁指针
信号本质上是一个非负的整数计数器,用来控制对公共资源的访问。
Pv原语是对信号量的操作:
l p操作每次使信号量减一
l V操作每次使信号量加一
操作函数
1) Linux信号量常用函数:
#include
int sem_init(sem_t *sem, int pshared, unsigned int value)
sem_init用于创建一个信号量,并能初始化它的值.
pshared参数决定信号量能否在几个进程间共享.由于目前Linux没实现进程间共享信号量,所以这个值只能为0.
value参数是信号量的初始化值.
2) P操作:
#include
int sem_wait(sem_t *sem)
int sem_trywait(sem_t *sem)
这两个函数相当于P操作,它们都能将信号量的值减一,两者的区别在于若信号量小于0时,sem_wait将阻塞进程,而sem_trywait则会立即返回
3) V操作:
#include
int sem_post(sem_t *sem)
int sem_getvalue(sem_t *sem)
int sem_destroy(sem_t *sem)
sem_post函数相当于V操作,它将信号量的值加1,同时发出信号唤醒等待进程.
sem_getvalue函数用于取得信号量的值.
sem_destroy函数用于删除信号量.