条件锁即在一定条件下触发,那什么时候适合用条件锁呢,那当然是你在等待一个符合的条件下触发。一个常用的例子就是在线程中无限循环执行一个操作,但是这个操作并不是需要 一直执行而是在满足一定条件下执行。例如:
int changed = 0; static pthread_mutext_t mtx = PTHREAD_MUTEX_INITALIZER; static pthread_cond_t cond = PTHREAD_COND_INITALIZER; void* thread_fun(void* argc) { while(true) { if(changed) { printf("i am changed"); }else { //方法一 sleep(1); //方法二 pthread_mutex_lock(&mtx); pthread_cond_wait(&cond,&mtx); pthread_mutex_unloc(&mtx); } } } void main() { pthread_t threadId; pthread_create(&threadId,NULL,thread_fun,NULL); sleep(10); changed = 1; //方法二 pthread_cond_signal(&cond); } |
从上面的例子可以看出当changed变量为1的时候才执行操作,其他时间不执行,如果使用sleep函数,那么将会出现执行不及时的现象,如果使用条件锁的话那么会在条件改变的时候立即执行,效果比较好。
那如果使用条件锁呢?
首先是条件锁的创建,条件锁创建有两种方法,一种是静态方法,既使用静态变量的方式:
static pthread_cond_t cond = PTHREAD_COND_INITALIZER;
另外一种是动态的方法:
pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);
其次是等待: pthread_cond_wait,此方法可以加超时的时间,如果没有超时的时间则是一直等待。
再次是触发:当达到条件之后使用 pthread_cond_signal通知
但是在多线程里面必须要配合互斥锁,因为在多线程的条件下如果不使用互斥锁,那么就有可能同时多个执行ptread_cond_wait会造成混乱。
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。