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

🍁感谢各位的观看🍁欢迎大家留言🍁咱们一起加油🍁努力成为更好的自己🍁
同步
同步:在保证数据安全的前提下,让线程能够按照某种特定的顺序访问临界资源,从而有效避免饥饿问题,叫做同步。
条件变量
条件变量,就是创建一个进程等待队列,处理完资源后就入队列,然后头部进程先执行,依次公平的竞争和处理资源,就向排队一样。
条件变量的创建
-
创建静态全局条件变量
代码: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,先进先出)、环形缓冲区等,使模型能解耦。缓冲区是共享资源,要加锁保护。

更多推荐






所有评论(0)