条件变量举例

条件变量的使用步骤:

 

pthread_mutex_t mutex;

条件变量也需要使用互斥锁。

pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;

初始化条件变量。

pthread_cond_signal(&cond_ready);

优先线程执行完后才发送信号。

pthread_cond_wait(&cond_ready, &mutex);

靠后的线程接受信号,并执行。

 

例子先扫五次地,在拖地!

 

# include <stdio.h>

# include <stdlib.h>

# include <string.h>

# include <pthread.h>

 

void *sweep();  //函数声明,sweep是扫地的意思

void *swab();  //函数声明,swab是拖地的意思

 

pthread_mutex_t mutex;  //存放互斥锁

pthread_cond_t  cond_ready = PTHREAD_COND_INITIALIZER;

char buf[255] = "开始打扫卫生啦!!!";  //创建共享资源

 

int main(void)

{

pthread_t tid[2];  //存放线程ID,因为要创建两个线程,所以定义一个长度为2的数组

int i = 0;  //循环变量

 

printf("%s\n", buf);

sleep(5);

 

pthread_mutex_init(&mutex, NULL);  //创建互斥锁,要在创建线程之前

pthread_create(&tid[0], NULL, sweep, NULL);  //创建扫地线程

pthread_create(&tid[1], NULL, swab, NULL);  //创建拖地线程

 

pthread_join(tid[0], NULL);  //等待扫地线程退出

pthread_join(tid[1], NULL);  //等待拖地线程退出

 

return 0;

}

 

void *sweep()  //sweep是扫地的意思

{

pthread_mutex_lock(&mutex);  //扫地上锁

 

int i = 1;

for (i=1; i<=5; ++i)

{

sprintf(buf, "我扫了%d次地", i);

printf("%s\n", buf);

 

sleep(2);

}

 

pthread_mutex_unlock(&mutex);  //扫地解锁

pthread_cond_signal(&cond_ready);

 

return;  //无返回值就写return;,或直接什么都不写,或写return NULL;

}

 

void *swab()  //swab是拖地的意思

{

//pthread_mutex_lock(&mutex);  /*拖地同样要上锁,只要是使用共享资源都要上锁,不然就算别的线程去获取互斥锁也没有意义。*/

pthread_cond_wait(&cond_ready, &mutex);

 

strcpy(buf, "我拖完地了");

printf("%s\n", buf);

 

pthread_mutex_unlock(&mutex);  //扫地解锁

 

return;  //无返回值就写return;,或直接什么都不写,或写return NULL;

}

 

 

多线程条件变量可以创建:

先扫地五次再拖地再抹地!

 

# include <stdio.h>

# include <stdlib.h>

# include <string.h>

# include <pthread.h>

 

void *sweep(); //函数声明,sweep是扫地的意思

void *swab(); //函数声明,swab是拖地的意思

 

void *madi();

 

pthread_mutex_t mutex; //存放互斥锁

pthread_cond_t cond_ready1 = PTHREAD_COND_INITIALIZER;//两个初始化条件变量来控制三个线程的执行顺序。

pthread_cond_t cond_ready2 = PTHREAD_COND_INITIALIZER;

char buf[255] = "开始打扫卫生啦!!!"; //共享资源

 

int main(void)

{

pthread_t tid[3]; //存放线程ID,因为要创建两个线程,所以定义一个长度为2的数组

int i = 0; //循环变量

printf("%s\n", buf);

sleep(5);

 

pthread_mutex_init(&mutex, NULL); //创建互斥锁,要在创建线程之前

pthread_create(&tid[0], NULL, sweep, NULL); //创建扫地线程

pthread_create(&tid[1], NULL, swab, NULL); //创建拖地线程

pthread_create(&tid[2], NULL, madi, NULL); //创建拖地线程

pthread_join(tid[0], NULL); //等待扫地线程退出

pthread_join(tid[1], NULL); //等待拖地线程退出

pthread_join(tid[2], NULL); //等待拖地线程退出

return 0;

}

 

void *sweep() //sweep是扫地的意思

{

pthread_mutex_lock(&mutex); //扫地上锁

int i = 1;

for (i=1; i<=5; ++i)

{

sprintf(buf, "我扫了%d次地", i);

printf("%s\n", buf);

sleep(2);

}

pthread_mutex_unlock(&mutex); //扫地解锁

pthread_cond_signal(&cond_ready1);

return; //无返回值就写return;,或直接什么都不写,或写return NULL;

}

 

void *swab() //swab是拖地的意思

{

//pthread_mutex_lock(&mutex); /*拖地同样要上锁,只要是使用共享资源都要上锁,不然就算别的线程去获取互斥锁也没有意义。*/

pthread_cond_wait(&cond_ready1, &mutex);

strcpy(buf, "我拖完地了");

printf("%s\n", buf);

sleep(2);

pthread_mutex_unlock(&mutex); //拖地解锁

pthread_cond_signal(&cond_ready2);

return; //无返回值就写return;,或直接什么都不写,或写return NULL;

}

 

void *madi()

{

pthread_cond_wait(&cond_ready2, &mutex);

strcpy(buf, "我抹完地了");

printf("%s\n", buf);

pthread_mutex_unlock(&mutex); //抹地解锁

return; //无返回值就写return;,或直接什么都不写,或写return NULL;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值