条件变量的使用步骤:
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;
}