APUE多线程同步--条件锁

转载 2013年12月03日 20:47:57
条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。  
   
  1.   创建和注销  
   
  条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量,如下:    
  pthread_cond_t   cond=PTHREAD_COND_INITIALIZER    
   
  动态方式调用pthread_cond_init()函数,API定义如下:    
  int   pthread_cond_init(pthread_cond_t   *cond,   pthread_condattr_t   *cond_attr)    
   
  尽管POSIX标准中为条件变量定义了属性,但在LinuxThreads中没有实现,因此cond_attr值通常为NULL,且被忽略。  
   
  注销一个条件变量需要调用pthread_cond_destroy(),只有在没有线程在该条件变量上等待的时候才能注销这个条件变量,否则返回EBUSY。因为Linux实现的条件变量没有分配什么资源,所以注销动作只包括检查是否有等待线程。API定义如下:    
  int   pthread_cond_destroy(pthread_cond_t   *cond)    

  

  2.   等待和激发   
   
int   pthread_cond_wait(pthread_cond_t   *cond,   pthread_mutex_t   *mutex)  
  int   pthread_cond_timedwait(pthread_cond_t   *cond,   pthread_mutex_t   *mutex,   const   struct   timespec   *abstime)    
   
   
   
  等待条件有两种方式:无条件等待pthread_cond_wait()和计时等待pthread_cond_timedwait(),其中计时等待方式如果在给定时刻前条件没有满足,则返回ETIMEOUT,结束等待,其中abstime以与time()系统调用相同意义的绝对时间形式出现,0表示格林尼治时间1970年1月1日0时0分0秒。  
   
  无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()(或pthread_cond_timedwait(),下同)的竞争条件(Race   Condition)。mutex互斥锁必须是普通锁(PTHREAD_MUTEX_TIMED_NP)或者适应锁(PTHREAD_MUTEX_ADAPTIVE_NP),且在调用pthread_cond_wait()前必须由本线程加锁(pthread_mutex_lock()),而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起进入等待前解锁。在条件满足从而离开pthread_cond_wait()之前,mutex将被重新加锁,以与进入pthread_cond_wait()前的加锁动作对应。  
   
  激发条件有两种形式,pthread_cond_signal()激活一个等待该条件的线程,存在多个等待线程时按入队顺序激活其中一个;而pthread_cond_broadcast()则激活所有等待线程。  

 


apue 中建议性记录锁和强制性记录锁的描述

书中描述:考虑数据库存取例程序。如果该库中所有函数都以一致的方法处理记录锁,则称使用这些函数存取数据库的任何进程集为合作进程( cooperatingpro c e ss)。如果这些函数是唯一的用来存...
  • hnmsky
  • hnmsky
  • 2009年07月02日 16:04
  • 1703

apue 11.6.2避免死锁

讨论避免的方法的时候,先看看什么条件下发生死锁。 这在《现代操作系统》中有描述: 如果一个线程集合产生死锁,那么它是这样的一个线程集合,该集合内的所有线程,都在等待该集合内其它线程释放资源。 按照...
  • abcef31415926
  • abcef31415926
  • 2016年12月27日 19:23
  • 193

条件锁

ReentrantLock类有一个方法newCondition用来生成这个锁对象的一个条件(ConditionObject)对象,它实现了Condition接口。Condition提供了线程通讯的一套...
  • yanlinwang
  • yanlinwang
  • 2014年10月30日 17:47
  • 2322

JAVA--多线程同步,锁对象,条件对象

多线程共享内存引发的问题:     问题引起的原因:线程并不持有资源,资源归进程所持有,多个线程并发执行时候, 线程访问资源的先后顺序无法保证 两个线程同时访问一个资源     这回导致结果的不可预...
  • a284266978
  • a284266978
  • 2015年10月18日 02:08
  • 488

关键段和旋转锁

原文地址:http://blog.csdn.net/morewindows/article/details/7442639 提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL...
  • msk10k
  • msk10k
  • 2016年03月06日 11:25
  • 651

多线程同步锁的使用范例

用一个买票的例子来示范多线程操作一个对象时,同步锁的使用。 如何加锁需要认真思考。...
  • fenggering
  • fenggering
  • 2016年11月14日 23:10
  • 2108

pthread_cond_t和pthread_mutex_t(条件变量和互斥锁)

pthread_mutex_t: 互斥锁,多线程中对共享变量的包吧 pthread_cond_t
  • fingding
  • fingding
  • 2014年07月03日 21:02
  • 7369

UNIX环境高级编程——线程同步之互斥锁、读写锁和条件变量(小结)

一、使用互斥锁1、初始化互斥量pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//静态初始化互斥量 int pthread_mutex_init(pt...
  • ctthunagchneg
  • ctthunagchneg
  • 2013年07月17日 12:27
  • 1761

Objective-C中的同步线程的锁

概述在多线程编程中往往会遇到多个线程同时访问共享的资源,这种情况我们需要通过同步线程来避免。也就是给线程加锁。 因为Objective-C是C语言的超集。,严格的来说是真超集。所以C语言当中的pth...
  • GGGHub
  • GGGHub
  • 2016年05月09日 16:01
  • 3162

linux 线程的条件锁

       我们先看下面的代码#include #include #include pthread_mutex_t count_lock; pthread_cond_t count_n...
  • benbendy1984
  • benbendy1984
  • 2011年01月26日 15:40
  • 2606
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:APUE多线程同步--条件锁
举报原因:
原因补充:

(最多只允许输入30个字)