注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Under the bule sky

Get what I want "cause I ask for it.

 
 
 

日志

 
 

Linux进程&线程--线程间的机制Ⅲ  

2014-08-12 13:07:30|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、线程同步(合作目的)
同步:多个线程按照约定的顺序相互配合完成一件事情
POSIX 线程间同步机制:无名信号量 

信号量 :它代表一类资源,其值代表资源的个数,是一个受保护的变量,不能直接赋值,只有三种操作方法:初始化信号量,p操作,v操作,应该成对使用!

用   sem_t   类型描述信号量。

1.定义一个信号量 
sem_t  read_sem;
sem_t  write_sem;
2.初始化信号量
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:初始化指定的信号量 
  参数
sem 信号量的地址 
pshared 0:线程间使用 非0:进程间使用 
  value 初始化的值 
  返回值:
成功返回0;失败返回-1,并置errno

例:封装初始化操作

int init_sem(sem_t *sem,unsigned int value)
{
if(sem_init(sem,0,value) < 0)
{
perror("sem_init");
exit(EXIT_FAILURE);
}
return 0;
}

3.P操作,申请资源,可能会引起调用线程阻塞
int sem_wait(sem_t *sem); 
功能:申请资源,如果没有资源,则引起调用者阻塞 
参数: sem 信号量的地址 
  返回值: 成功返回0,失败返回-1,并置errno 
例:P操作函数

int P(sem_t *sem)
{
if(sem_wait(sem) < 0)
{
perror("sem_wait");
exit(EXIT_FAILURE);
}
return 0;
}

4.V操作:释放资源
int sem_post(sem_t *sem);
功能:释放资源,如果有等待资源的线程,则唤醒第一个等待的线程
参数: sem 信号量的地址 
  返回值: 成功返回0,失败返回-1
例:V操作函数

int V(sem_t *sem)
{
if(sem_post(sem) < 0)
{
perror("sem_post");
exit(EXIT_FAILURE);
}
return 0;
}

二、线程间互斥(竞争目的)

互斥:保证某一个时刻只有一个线程访问资源。 (国外电话亭会有锁,火车上的厕所,打电话是会关上门,其他人暂时无法使用,完后开门,其他人可以使用)。


POSIX 线程间互斥机制:互斥锁,保证操作临界资源完整性,防止竞争

pthread_mutex_t 类型描述互斥锁


(1).临界资源 : 一段时间内只允许有一个任务访问,应该加锁保护 

  (2).临界区 : 访问临界资源的一段代码,即影响共享数据的代码段


互斥锁操作:

(1)定义互斥锁 

pthread_mutex_t lock;


(2)初始化互斥锁

//动态初始化:指定锁的属性

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

const pthread_mutexattr_t *restrict attr);


//静态初始化:锁只能使用默认的属性,注意只能在定义时使用!

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

 
(3)申请互斥锁 
int pthread_mutex_lock(pthread_mutex_t *mutex); 
特点:如果互斥锁被别的线程的使用,则阻塞调用者 
 
(4)释放互斥锁 
  int pthread_mutex_unlock(pthread_mutex_t *mutex); 

  (5)销毁互斥锁 
int pthread_mutex_destroy(pthread_mutex_t *mutex);


三、线程间的条件变量
条件变量可以使线程睡眠等待某种条件出现。 
条件变量是利用线程间共享的全局变量进行同步的一种机制。
主要包括两个动作:
一个线程等待"条件变量的条件成立"而阻塞等待 另一个线程使"条件成立"(给出条件成立信号),从而唤醒等待的 线程. 
 为了防止竞争,条件变量总是和一个互斥锁结合在一起使用。 一般说来,条件变量被用来进行线程间的同步。 条件变量用在某个线程需要在某种条件才去保护它将要操作的临界区的情况下, 从而避免了线程不断轮询检查该条件是否成立而降低效率的情况,提高效率 
 
pthread_cond_t类型描述条件变量
(1)定义一个条件变量 
pthread_cond_t cond; 

  (2)初始化条件变量 
//动态初始化 
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); 
//静态初始化 pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 

(3)让线程等待一个条件 int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); 
功能:等待一个条件 
  参数: cond 等待的条件 mutex 互斥锁 
  返回值: 成功返回0, 失败返回错误码

注意: 
pthread_cond_wait 内部实现:
1.前一次调用,条件不满足,释放锁,然后阻塞
2.后一次调用,条件满足,获得锁,然后返回

(4)唤醒等待条件线程 
//唤醒等待队列中所有等待该条件的线程
int pthread_cond_broadcast(pthread_cond_t *cond);

//唤醒第一个等待条件的线程
int pthread_cond_signal(pthread_cond_t *cond);
  评论这张
 
阅读(10)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017