Welcome 微信登录

首页 / 操作系统 / Linux / Linux下利用条件变量实现读写锁

首先介绍下pthread_cond_t。 在Linux下称之为状态变量,与之相关的有下面几个API:    int pthread_cond_init (pthread_cond_t *COND,pthread_condattr_t *cond_ATTR);
    int pthread_cond_signal (pthread_cond_t *COND);
    int pthread_cond_broadcast (pthread_cond_t *COND);
    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);
    int pthread_cond_destroy (pthread_cond_t *COND);这里就讲下2个api,pthread_cond_signal和pthread_cond_wait,一般的用法如下:{    pthread_mutex_lock(lock) ...    pthread_cond_wait(cond, lock); ...    pthread_cond_mutex_unlock(lock);}pthread_cond_wait会解锁lock,然后在cond上等待,这两步是atomic operation. 当pthread_cond_wait返回时,会同时对lock上锁. 这里我的理解是,如果获取不到lock锁,即使cond已经被激活,pthread_cond_wait依然不会返回。{    pthread_mutex_lock(lock); ...    pthread_cond_signal(cond); ...    pthread_mutex_unlock(lock);}pthread_cond_signal调用之前一定会先拿到lock锁。pthread_cond_signal不会去管lock锁,只是将cond激活,接下去释放lock锁。这时候pthread_cond_wait就可以得到lock从而返回了。言归正传,下面是利用条件变量实现的一个读写锁的例子:typedef struct pthread_rwlock{ int active_readers; /* -1 when writer lock locked, >0 when read lock locked */ int pending_readers; int pending_writers; pthread_mutex_t mutex; pthread_cond_t ok_to_read; pthread_cond_t ok_to_write;} pthread_rwlock_t ;int pthread_rwlock_init(pthread_rwlock_t * lock, pthread_rwlockattr_t *attr)
{
 active_readers = 0;
 pending_readers = 0;
 pending_writers = 0;
 pthread_mutex_init(&lock->mutex, NULL);
 pthread_cond_init(&lock->ok_to_read, NULL);
 pthread_cond_init(&lock->ok_to_write, NULL);
 return 0;
}
int pthread_rwlock_destroy(pthread_rwlock_t * lock)
{
 pthread_mutex_destroy(&lock->mutex);
 pthread_cond_destroy(&lock->ok_to_read);
 pthread_cond_destroy(&lock->ok_to_write);
 return 0;
}
int pthread_rwlock_rdlock(pthread_rwlock_t * lock)
{
 pthread_mutex_lock(&lock->mutex);
 lock->pending_readers++;
 while(lock->active_readers < 0) /* the write lock locked */
  pthread_cond_wait(&lock->ok_to_read, &lock->mutex);
 lock->pending_readers--;
 lock->active_readers++;
 pthread_mutex_unlock(&lock->mutex);
 return 0;
}
int pthread_rwlock_wrlock(pthread_rwlock_t * lock)
{
 pthread_mutex_lock(&lock->mutex);
 lock->pending_writers++;
 while(lock->active_readers) /* the write lock or read lock locked */
  pthread_cond_wait(&lock->ok_to_write, &lock->mutex);
 lock->pending_writers--;
 lock->active_readers = -1;
 pthread_mutex_unlock(&lock->mutex);
 return 0;
}
int pthread_rwlock_unlock(pthread_rwlock_t * lock)
{
 pthread_mutex_lock(&lock->mutex);
 assert(lock->active_readers)
 if (lock->active_readers > 0) /* release the read lock */
 {
  lock->active_readers--;
  if (lock->active_readers == 0) /* no read lock locked */
  {
   pthread_cond_signal(&lock->ok_to_write);
  }
 } else if (lock->active_readers < 0) /* release the write lock */
 {
  lock->active_readers=0;
  /* it may be different, when write lock has higher priority than read lock */
  if (lock->pending_readers > 0) {
   pthread_cond_broadcast(&lock->ok_to_read);
  } else if (lock->pending_writers > 0) {
   pthread_cond_signal(&lock->ok_to_write);
  }
 }
 pthread_mutex_unlock(&lock->mutex);
 return 0;
}
还有pthread_rwlock_tryrdlock 和 pthread_rwlock_trywrlock,感兴趣的自己写吧,感觉这两个用的不多。解决Linux虚拟机用putty不能登陆问题Linux下利用条件变量实现信号量机制相关资讯      Linux教程 
  • Linux教程:如何在命令行中查看目  (07/28/2014 12:22:23)
  • Linux 修改root密码  (11/03/2012 07:53:38)
  • su - root 与su root的区别  (06/06/2012 00:39:40)
  • Linux进程间通信:消息队列  (01/28/2013 09:43:00)
  • U盘安装Linux开机无法启动解决方法  (10/07/2012 08:55:52)
  • Windows 7/Linux 同步时间  (05/15/2012 06:17:55)
本文评论 查看全部评论 (1)
表情: 姓名: 字数


评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
版权所有©石家庄振强科技有限公司2024 冀ICP备08103738号-5 网站地图