进程同步,条件变量,pthread_cond_wait,pthread_cond_init,PTHREAD_COND_INITIALIZER

来源:互联网 发布:三菱plc仿真软件汉化 编辑:程序博客网 时间:2024/04/30 04:39

条件量同互斥锁一样也是进程同步的一种机制,互斥锁是用来加锁,而条件量则是用来等待,主要包括两个动作,一是线程等待“满足条件成立”而挂起,二是线程满足“成立条件”而被唤醒,由于是多线程,为了防止竞争,所以条件量一般和锁一起使用。

创建互斥量cond:

pthread_cond_t cond = PTHREAD_COND_INITIALIZER

还可以通过函数的方式创建:

int pthread_cond_init(pthread_cond_t *cond,NULL);

注意:两种方式创建有所区别,第一种是创建静态全局的,所创建的量在全局区,第二种创建的量在栈,两种的区别我们可以理解为全局变量和局部变量的差异,对于两种方式,如果创建的是全局的条件量则用第一种方式初始化,如果是在函数内部创建则用第二种方式。这里其实跟互斥锁一样,互斥锁也可以用这两种方式初始化,原理相同。

注销互斥量:

int pthread_cond_destroy(pthread_cond_t *cond);

注意:只有在没有线程使用该互斥量的时候才能销毁,否则会返回EBUSY。


等待:

当线程不满足给定条件时,让线程挂起,挂起分为两种,一种是无限制的等待,pthread_cond_wait;一种是定时等待,pthread_cond_timedwait。无论是哪种等待都必须和锁配合使用,防止多个线程同时使用互斥量。

注意两个函数

pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);

pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,const struct timespec *time);


唤醒:

当线程满足某个条件时,可以唤醒被挂起的线程,唤醒有两个函数

一是唤醒等待该互斥量的线程:

pthread_cond_signal(pthread_cond_t *cond);

二是唤醒所有等待线程:

pthread_cond_broadcast(pthread_cond_t *cond);


现在可以通过下面的一个简单实例加深理解:


void st_tpool_clean(void *mutex){pthread_mutex_t *mutex = (pthread_mutex_t *)mutex;pthread_mutex_unlock(mutex);}//end st_tpool_cleanvoid st_tpool_waitTask(pthread_mutex_t *mutex,pthread_cond_t *cond){pthread_cleanup_push(st_tpool_clean,mutex);pthread_mutex_lock(mutex);pthread_cond_wait(cond,mutex);pthread_mutex_unlock(mutex);pthread_cleanup_pop(0);

对代码的理解可以结合我的上一篇文章,关于pthread_cleanup_push/pthread_cleanup_pop,可以加深理解。




1 0
原创粉丝点击