线程信号:
上一节中我们学了可以用锁来帮助控制线程的执行与否,那么我们经常想要先让一个线程先执行,等他执行之后另一个线程紧接着执行,这个时候就可以搭配cond这个信号来使用锁。
首先还是要看手册,声明一个cond量并在主函数里初始化,
当某个条件发生的时候,我t1才去做某个事情 以下程序代码实现
记住:触发与广播的区别是 :触发只发一条,而广播可以向多个线程发消息
pthread_mutex_t mutex;
pthread_cond_t cond;
int terdata=0;
void*fund1(void*arg){
while(1){
pthread_cond_wait(&cond,&mutex);
if(terdata==3){
printf("t1=%d -------------------\n",terdata);
terdata=0;
sleep(1);
}
}
}
void*fund2(void*arg){
while(1){
pthread_mutex_lock(&mutex);
printf("t2 terdata=%d \n",terdata++);
if(terdata==3){
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
sleep(1);
}
// printf("t2 terdata=%d \n",terdata++);
}
int main(){
int ret;
pthread_t t1;
int arg=100;
pthread_t t2;
pthread_cond_init(&cond,NULL);
pthread_mutex_init(&mutex,NULL);
ret=pthread_create(&t1,NULL,fund1,(void*)&arg);
if(ret==0){
printf(" main t1 pthread create success!!!\n");
}
ret=pthread_create(&t2,NULL,fund2,(void*)&arg);
if(ret==0){
printf(" main t2 pthread create success!!!\n");
}
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_cond_destroy(&cond);
pthread_mutex_destroy(&mutex);
return 0;
}
其中重点是t2线程里面的sleep特别重要,要给出signal和wait一点响应时间,不然实现不了t1里面的内容,一直会停流在t2线程里面。
运行结果为:
CLC@Embed_Learn:~/thread$ ./a.out
main t1 pthread create success!!!
main t2 pthread create success!!!
t2 terdata=0
t2 terdata=1
t2 terdata=2
t1=3 -------------------
t2 terdata=0
t2 terdata=1
t2 terdata=2
t1=3 -------------------
t2 terdata=0
t2 terdata=1
t2 terdata=2
t1=3 -------------------