Linux 开发之线程条件锁那些事

条件锁即在必定条件下触发,那何时适合用条件锁呢,那固然是你在等待一个符合的条件下触发。一个经常使用的例子就是在线程中无限循环执行一个操做,可是这个操做并非须要 一直执行而是在知足必定条件下执行。例如:多线程

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会形成混乱。

相关文章
相关标签/搜索