条件等待
- 意义:程序一执行可能不需要很多线程一起跑,需要等待某个线程执行到特定的位置后再执行另一进程,此时就需要了条件变量
基础函数
- 创建条件变量(必须是全局)
pthread_cond_t pcond; //声明一个条件变量
2.条件变量初始化
pthread_cond_init(&pcond,nullptr); //初始化条件变量
//参数1:条件变量的地址
//参数2:通常为NULL
3.条件等待
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
//参数一:同上。
//参数二 :即为锁,这个锁用来解开唤醒这个条件变量的所控制的线程,可以解开这个锁,
4.唤醒条件变量
int pthread_cond_signal(pthread_cond_t *cond);
//参数1:条件变量地址
5.摧毁条件变量
int pthread_cond_destroy(pthread_cond_t *cond)
//参数1:条件变量地址
案例
场景:有多个线程的前提下,某个线程不一定要一开始就执行,先进入休眠状态,直到某个线程执行到一定程度后,唤醒休眠进程继续执行,用上面的例子修改,当fun1进入休眠状态,fun2的data加到5的时候唤醒fun1进程执行以下代码
#include <stdio.h>
#include <pthread.h>
int data = 0;
pthread_mutex_t mutex; // 创建锁
pthread_cond_t con; // 创建一个条件
void *fun1(void *arg)
{
int i = *((int *)arg);
printf("t1:fun1 threadid is %ld\n", (unsigned long)pthread_self());
printf("t1:contact is %d\n", i);
while (1)
{
pthread_cond_wait(&con, &mutex); // 如果先是fun1运行到这里会休眠
if (data == 5)
{
printf("t1 quit===================\n");
}
printf("t1 = %d\n", data);
data = 0;
sleep(1);
}
}
void *fun2(void *arg) // 不断的对共享资源进程修改直到满足fun1的要求从而唤醒fun1
{
int i = *((int *)arg);
printf("t2:fun1 threadid is %ld\n", (unsigned long)pthread_self());
printf("t2:contact is %d\n", i);
while (1)
{
printf("t2:%d\n", data);
pthread_mutex_lock(&mutex);
data++;
if (data == 5)
{
pthread_cond_signal(&con); // 如果data等于5 就会唤醒fun1
}
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
int main()
{
pthread_t t1; // 进程号
pthread_t t2; // 进程号
int ret;
int param = 100; // 线程调用的函数需要的传递的参数
pthread_mutex_init(&mutex, NULL); // 初始化锁
pthread_cond_init(&con, NULL); // 初始化条件
ret = pthread_create(&t1, NULL, fun1, ¶m);
if (ret == 0)
{
//printf("main:create success!\n");
}
ret = pthread_create(&t2, NULL, fun2, ¶m);
if (ret == 0)
{
//printf("main:create success!\n");
}
printf("main:%ld\n", (unsigned long)pthread_self());
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_mutex_destroy(&mutex);//销毁锁
pthread_cond_destroy(&con); //销毁条件变量
return 0;
}
运行结果:
通过代码我们可以看到,这个对于data的访问一定格式线程2先访问完之后,再唤醒线程1去对公共变量data的访问控制,实现的比较灵活,在实际工作中具有重要意义。