目录

同步

条件变量

条件变量的创建

条件变量的销毁

条件变量的等待

条件变量的唤醒

解决饥饿问题

​编辑

生产者消费者模型

介绍


只有认知的突破💫才能带来真正的成长💫编程技术的学习💫没有捷径💫一起加油💫 

🍁感谢各位的观看🍁欢迎大家留言🍁咱们一起加油🍁努力成为更好的自己🍁

同步

同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步。

条件变量

条件变量,就是创建一个进程等待队列,处理完资源后就入队列,然后头部进程先执行,依次公平的竞争和处理资源,就向排队一样。

条件变量的创建
  • 创建静态全局条件变量

代码:pthread_cond_t cond = PTHREAD_COND_INITIALIZER

  • 创建动态局部条件变量,要使用函数初始化。

函数:int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);使用该函数进行条件变量的初始化。

条件变量的销毁

函数:int pthread_cond_destroy(pthread_cond_t *cond)

条件变量的等待

函数:int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex) 使用它,使线程在条件变量的等待队列中,进行等待。进入等待队列的线程,会把申请到的锁给释放掉。当被唤醒后,还会归还锁。

参数:

  • pthread_cond_t *restrict cond:在指定的条件变量等待。

  • pthread_mutex_t *restrict mutex:释放自己申请到的锁。

条件变量的唤醒
  • 函数:int pthread_cond_broadcast(pthread_cond_t *cond) 。广播唤醒所有的进程处理资源。

  • 函数:int pthread_cond_signal(pthread_cond_t *cond)。唤醒至少一个线程处理资源。

解决饥饿问题

互斥锁+条件变量=解决饥饿问题。如下所示的代码。

// 操作共享变量会有问题的售票系统代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

int ticket = 10;   //总票数
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;  //创建锁
pthread_cond_t cond=PTHREAD_COND_INITIALIZER;   //创建条件变量
void *route(void *arg)
{
    char *id = (char *)arg;
    while (ticket>0)
    {
        pthread_mutex_lock(&mutex); //加锁
        pthread_cond_wait(&cond,&mutex);//等待队列等待
        if(ticket<=0) break;
        printf("%s sells ticket:%d\n", id, ticket);
        ticket--;
        pthread_mutex_unlock(&mutex);//释放锁
    }
    //避免抢到票为0,锁未释放
    pthread_mutex_unlock(&mutex);//释放锁
    return (void*)0;
}
int main(void)
{
    pthread_t t1, t2, t3, t4;   //创建4个线程
    pthread_create(&t1, NULL, route, (void *)"thread 1");
    pthread_create(&t2, NULL, route, (void *)"thread 2");
    pthread_create(&t3, NULL, route, (void *)"thread 3");
    pthread_create(&t4, NULL, route, (void *)"thread 4");
    sleep(3);
    while(1)
    {
        pthread_cond_signal(&cond);
        //每隔1秒唤醒一个线程
        sleep(1);
    }
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_join(t3, NULL);
    pthread_join(t4, NULL);
    //等待完所有的线程后,进行锁的销毁
     pthread_mutex_destroy(&mutex);
     pthread_cond_destroy(&cond);//释放条件变量
    return 0;
}

生产者消费者模型

作用:解决生产数据消费数据的速度不匹配问题,同时实现生产、消费逻辑的解耦,提升系统并发处理能力和资源利用率。

介绍

模型由 3 个核心部分组成,职责清晰、各司其职:

  • 生产者:负责创建 / 生成数据的线程 / 进程(比如采集日志、接收网络请求、解析文件等),生产完成后将数据交付至缓冲区,不直接与消费者交互。

  • 消费者:负责处理 / 消费数据的线程 / 进程(比如分析日志、处理请求、计算数据等),仅从缓冲区获取数据,不直接与生产者交互。

  • 缓冲区:连接生产者和消费者的中间容器(核心 “桥梁”),本质是一块内存区域,常见实现有队列(FIFO,先进先出)、环形缓冲区等,使模型能解耦。缓冲区是共享资源,要加锁保护。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐