进程同步,条件变量,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,可以加深理解。
- 进程同步,条件变量,pthread_cond_wait,pthread_cond_init,PTHREAD_COND_INITIALIZER
- 条件变量、pthread_cond_init
- 条件变量 pthread_cond_init
- 条件变量、pthread_cond_init
- 条件变量、pthread_cond_init
- 条件变量、pthread_cond_init
- 条件变量、pthread_cond_init
- 初始化条件变量pthread_cond_init
- 条件变量、pthread_cond_init
- 条件变量、pthread_cond_init
- pthread_cond_init,pthread_cond_wait
- linux线程条件变量、pthread_cond_init
- 线程同步之条件变量:pthread_cond_signal和pthread_cond_wait
- 线程同步之条件变量:pthread_cond_signal和pthread_cond_wait
- 条件变量pthread_cond_wait浅谈
- Linux 条件变量 pthread_cond_wait
- Linux 条件变量 pthread_cond_wait
- Linux 条件变量 pthread_cond_wait
- 【SPOJ-NAGAY】Joseph’s Problem【余数求和】【分块】
- 在Eclipse中创建Maven多模块工程的例子
- Wordpress 网站搭建及性能监控方法详解!
- C++类和对象的应用实例——链表
- java将集合转换为数组(二维数组)
- 进程同步,条件变量,pthread_cond_wait,pthread_cond_init,PTHREAD_COND_INITIALIZER
- Ubuntu登陆windows搭建的FTP服务器文件名乱码解决方法
- 关于如果自己一个人负责测试一个app的思考
- Palindrome Number
- PAT--1084 Broken Keyboard
- collectionview resueview 重影的问题
- xib 自定义cell高度
- 在 const 和 non-const 重载的成员函数中避免代码重复
- volley框架使用