【lesson57】信号量和生产者消费者模型(环形队列版)

信号量概念

POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但POSIX可以用于线程间同步。

什么是信号量?
共享资源—>保证任何时刻都只有一个执行流进行访问----->也就有了之前的临界资源,临界区的概念

之前的互斥加锁—>将共享资源当做整个使用。
但是不同的线程可能访问同一个共享资源的不同区域,这样如何我们加个整体锁必定带来整个进行效率的降低。

如果一个共享资源不当做一个整体,而让不同的执行流访问不同的区域的话,那么不就提高了并发度吗?是的。
而只有当不同的线程访问同一个区域的时候我们再进行同步与互斥。

两个问题
1.我们怎么知道一整个共享区,一共有多少个资源,还剩多少个资源?
2.我们怎么保证这个资源就是给我们的?(程序员编码保证)我们怎么知道线程一定可以具有一个共享资源(信号量保证)

电影院买票的例子:
买票的本质:叫做资源(电影院座位)的预订机制

信号量本质:是一个计数器,访问临界资源的时候,必须先申请资源(sem–预订资源),使用完毕后信号量资源必须释放(sem++)
如何理解信号量的使用—>我们申请一个信号量---->当前执行流一定具有一个资源,可以被它使用—>是哪个资源呢?---->需要程序员结合场景,自定义编码完成。

信号量接口

初始化

int sem_init(sem_t *sem, int pshared, unsigned int value);
//参数:
//pshared:0表示线程间共享,非零表示进程间共享
//value:信号量初始值

销毁

 int sem_destroy(sem_t *sem);

等待

//功能:等待信号量,会将信号量的值减1
int sem_wait(sem_t *sem);

发布

//功能:发布信号量,表示资源使用完毕,可以归还资源了。将信号量值加1。
int sem_post(sem_t *sem);

基于环形队列的生产者消费者模型

在这里插入图片描述
环形队列采用数组模拟,用模运算来模拟环状特性环形结构起始状态和结束状态都是一样的不好判断为空或者为满,所以可以通过加计数器或者标记位来判断满或者空。另外也可以预留一个空的位置,作为满的状态
但是我们现在有信号量这个计数器,就很简单的进行多线程间的同步过程
在这里插入图片描述
什么时候生产者和消费者会访问同一个位置?
在这里插入图片描述
1.环形队列空的时候,生产者和消费者会访问同一个位置
2.环形队列满的时候,生产者和消费者会访问同一个位置
3.其它情况不会访问同一个位置。

那么该如何解决?
1.用计数器解决
2.专门浪费一个格子解决

如果生产者和消费者指向了环形结构的同一个位置;那么生产者和消费者要有互斥或者同步的问题,不然生产者和消费者指向的都是不同的位置。

当生产者和消费者指向同一个位置,具有互斥同步关系就可以。
当生产者和消费者不指向同一个位置想让他们并发执行呢?
期望:
1.生产者不能将消费者套圈。
2.消费者超过生产者
3.环形队列为空:一定要让生产者先行
4.环形队列为满:一定要让消费者先行

怎么编码保证?
生产者:最关注的是空间资源
消费者:最关注的是空间里面的数据资源
最开始计数器值:
生产者:spaceSem---->为最大的N
消费者:dataSem---->为0

生产者:生产一个数据
P(spaceSem)—>spaceSem- -
V(dataSem)----->dataSem++
消费者:消费一个数据
P(dataSem)—>dataSem- -
V(spaceSem)----->spaceSem++

编码

Common.h

#pragma once
#include <iostream>
#include <array>
#include <functional>
#include <ctime>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>



#define RingQueueNum 5//环形队列空间大小
#define CONSUMRT_NUM 2//生产者个数
#define PRODUCTER_NUM 2//消费者个数
//生产者和消费者个数可以自定义

LockGuard.hpp

#pragma once
#include "Common.h"

//自己封装的锁,可以自动初始化和销毁
class Mutex
{
   
   
public:
    Mutex()
    {
   
   
        pthread_mutex_init</
<think>好的,用户想了解或使用名为Lesson模型在IT领域的应用或技术文档。首先,我需要确认Lesson模型的具体信息,但根据提供的引用内容,并没有直接提到Lesson模型。可能用户有拼写错误,或者该模型是某个特定领域的内部名称。接下来,我需要分析现有引用中的信息,看看是否能关联到可能的模型。 引用[1]提到模型部署生产环境的应用,这适用于一般模型的部署流程,可能对用户有帮助。引用[2]提到Intern Studio开发机中的模型存放,可能Lesson模型是这些共享文件中的一部分,用户可能需要按照文档步骤创建模型文件夹。引用[3]涉及统计术语,可能与模型评估指标相关,但不确定是否直接关联。 可能的步骤包括: 1. 确认模型名称是否正确,是否存在拼写错误。 2. 检查Intern Studio的共享文件,按照引用[2]的指引查找模型。 3. 参考模型部署的通用流程(引用[1])进行部署应用。 4. 联系相关团队或查阅内部文档获取更多信息。 用户可能需要具体的操作步骤,例如如何访问共享文件、部署模型等。需要提醒用户检查模型名称,并按照提供的引用步骤操作。如果Lesson模型属于大模型,引用[1]中的核心代码解析可能有帮助。同时,技术文档可能包含在共享文件中,需按照引用[2]的路径查找。</think>关于Lesson模型的技术文档应用场景,根据现有信息提供以下分析框架: ### 一、模型名称确认与验证 1. 建议先确认模型全称是否为`Lesson`或存在拼写差异(如`Lessons`/`LeSON`) 2. 检查开发环境共享目录(路径示例): ```bash cd /root/models && ls -l | grep -i lesson ``` 参考Intern Studio开发机的模型管理规范[^2] ### 二、IT领域典型应用场景 根据模型部署通用原则[^1],可能应用包括: 1. **智能教学系统** - 代码辅助教学:$E=MC^2$ 公式推导辅助 - 编程作业自动评估:$$ \text{Score} = \frac{\sum_{i=1}^n \text{Correct}_i}{n} \times 100\% $$ 2. **技术文档处理** - 自动化文档生成 - API接口说明智能补全 ### 三、技术文档获取路径 1. 标准获取流程: ```mermaid graph TD A[登录Intern Studio] --> B[访问共享目录] B --> C{检查/models目录} C -->|存在| D[查阅LESSON_README.md] C -->|不存在| E[联系模型管理团队] ``` 2. 关键参数说明(示例): ```python class LessonConfig: def __init__(self): self.hidden_size = 768 # 隐层维度 self.num_layers = 12 # 变压器层数 self.dropout = 0.1 # 正则化系数 ``` 参考大模型编程规范 ### 四、性能验证指标 建议包含以下测试项: $$ \text{Accuracy} = \frac{TP+TN}{TP+TN+FP+FN} $$ $$ \text{F1} = 2 \times \frac{Precision \times Recall}{Precision + Recall} $$ 相关统计指标定义参见[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值