世界是平的
ouyangzp
全部博文(11)
2011年(1)
2010年(1)
2009年(9)
分类: LINUX
2009-09-09 23:34:31
#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;
}
上一篇:sys/poll.h do not define POLLRDNORM
下一篇:回忆录序
登录 注册