条件锁即在必定条件下触发,那何时适合用条件锁呢,那固然是你在等待一个符合的条件下触发。一个经常使用的例子就是在线程中无限循环执行一个操做,可是这个操做并非须要 一直执行而是在知足必定条件下执行。例如:多线程
int changed = 0;函数
static pthread_mutext_t mtx = PTHREAD_MUTEX_INITALIZER;线程
static pthread_cond_t cond = PTHREAD_COND_INITALIZER;it
void* thread_fun(void* argc)thread
{变量
while(true)循环
{gc
if(changed)方法
{static
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会形成混乱。