Chinaunix首页 | 论坛 | 博客
  • 博客访问: 22779
  • 博文数量: 11
  • 博客积分: 1421
  • 博客等级: 上尉
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-05 20:17
文章存档

2011年(1)

2010年(1)

2009年(9)

我的朋友
最近访客

分类: LINUX

2009-09-09 23:34:31

线程同步-条件变量

1.条件变量
下面是等待断言x == y为真时所用的正确非忙等策略
1.锁定互斥量
2.测试条件x == y
3.如果为真,解除互斥量的锁定,并退出循环
4。如果为假, 将线程挂起,并解除对互斥量的锁定

创建和销毁条件变量

#include <pthread.h>
int pthread_cond_init(pthread_cond_t *restrict cond,
                   const pthread_cond_attr_t *restrict attr );
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

int pthread_cond_destroy(pthread_cond_t *cond);
等待并通知条件

int pthread_cond_timedwait(pthread_cond_tcond, pthread_mutex_t mutex, const struct timespec abstime);

int pthread_cond_wait(pthread_cond_tcond, pthread_mutex_t mutex);

int pthread_cond_broadcast(pthread_cond_t *cond);
int pthread_cond_signal(pthread_cond_t *cond);

下面是使用条件变量时要遵守的规则:
1.在测试断言之前获得互斥量
2.因为返回可能是由某些不相关的事件或无法使断言成真的pthread_cond_signal引起的,所以要在pthread_cond_wait返回之前重新对断言进行判断
3.在修改断言出现的任意变量前获得互斥量
4.仅仅在较短的时间内持有互斥量
5.显示的或者隐式的(pthread_cond_wait)释放互斥量

一个线程安全的路障实现

#include <errno.h>
#include <pthread.h>

static pthread_cond_t bcond = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t bmutex = PTHREAD_MUTEX_INITIALIZER;
static int count = 0;
static int limit = 0;

int initbarrier(int n) /* initialize the barrier

                                      to be size n */


{

int error;
if(error = pthread_mutex_lock(&bmutex))
  return error;
if(limit != 0) // barrier can only be initialized once

{
  pthread_mutex_unlock(&bmutex);
  return EINVAL;
}

  limit = n;
  return pthread_mutex_unlock(&bmutex);
}


int waitbarrier(void)

{

   int berror = 0;

   int error;

   if(error = pthread_mutex_lock(&bmutex));

        return error;

   if(limit <= 0) //make sure barrier initialized


   {

      pthread_mutex_unlock(&bmutex);

      return EINVAL;

   }

   count ++;

   while((count < limit) && !berror)

     berror = pthread_cond_wait(&bcond, &bmutex);

  if(!berror)

   berror = pthread_cond_broadcast(&bcond); //wakeup everyone

  error = pthread_mutex_unlock(&bmutex);

  if(berror)

   return berror;

  return error;

}

阅读(452) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~