Chinaunix首页 | 论坛 | 博客
  • 博客访问: 347166
  • 博文数量: 78
  • 博客积分: 3380
  • 博客等级: 中校
  • 技术积分: 857
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-16 19:39
文章分类

全部博文(78)

文章存档

2011年(31)

2010年(47)

分类: LINUX

2010-07-16 21:56:58

七、线程间的同步机制

7.1、互斥锁通信机制

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);

参数一:初始化的互斥锁指针

7.2、线程信号量通信机制

信号本质上是一个非负的整数计数器,用来控制对公共资源的访问。

Pv原语是对信号量的操作:

p操作每次使信号量减一

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函数用于删除信号量.

阅读(895) | 评论(0) | 转发(0) |
0

上一篇:线程基础

下一篇:系统调用知识

给主人留下些什么吧!~~