当前位置: 首页 > wzjs >正文

企业网站开发需要多少钱2022最新时事新闻及点评

企业网站开发需要多少钱,2022最新时事新闻及点评,室内装修效果图网站有哪些,大连开发区论坛网一、信号量的特性: 生产者为任务A、B,消费者为任务C、D一开始信号量的计数值为0,如果任务C、D想获得信号量,会有两种结果: 阻塞:买不到东西咱就等等吧,可以定个闹钟(超时时间)即刻返回失败&…

一、信号量的特性:

  • 生产者为任务A、B,消费者为任务C、D
  • 一开始信号量的计数值为0,如果任务C、D想获得信号量,会有两种结果:
    • 阻塞:买不到东西咱就等等吧,可以定个闹钟(超时时间)
    • 即刻返回失败:不等
  • 任务A、B可以生产资源,就是让信号量的计数值增加1,并且把等待这个资源的顾客唤醒
  • 唤醒谁?谁优先级高就唤醒谁,如果大家优先级一样就唤醒等待时间最长的人

二、创建信号量,释放信号量,获取信号量,删除信号量

创建信号量

SemaphoreHandle_t xSemaphoreCreateCounting(UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);

删除信号量

void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );

对于动态创建的信号量,不再需要它们时,可以删除它们以回收内存。

释放信号量​
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );

获取信号量

BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore,TickType_t xTicksToWait);

        

三、信号量创建为 xSemaphoreCreateCounting(1, 2) 会发生什么。以及一次 xSemaphoreGive 是否能“释放两个信号量”。

1. 回答:初始计数为 2 的话,代码有两个信号量同时进行时吗?

  • 初始计数为 2 的含义
    • 初始计数为 2(如 xSemaphoreCreateCounting(3, 2))表示信号量创建时有 2 个可用计数,允许最多两个任务通过 xSemaphoreTake 获取信号量而不阻塞。
    • 在你的代码中,这意味着:
      • 第一个 CarTask 调用 xSemaphoreTake,计数从 2 减到 1,任务运行(汽车移动)。
      • 第二个 CarTask 调用 xSemaphoreTake,计数从 1 减到 0,任务运行。
      • 第三个 CarTask 调用 xSemaphoreTake,计数为 0,任务阻塞。
      • 结果:两个 CarTask 任务同时运行(两个汽车同时移动),第三个任务等待。
    • 澄清“两个信号量同时进行”
      • 你的表述可能误认为“两个信号量”是指两个独立的信号量对象,但实际上只有一个信号量 g_xSemTicks。
      • 初始计数 2 允许两个任务同时持有信号量(通过 xSemaphoreTake),表现为两个任务“同时进行”,但这不是“两个信号量”,而是一个信号量控制了两个任务的并发。
  • 游戏中的行为
    • 初始计数为 2 允许两个汽车同时在屏幕上移动(pcar->x += 1),第三个汽车等待,直到某个任务释放信号量。
    • 这与初始计数为 1(一次只有一个汽车移动)或 3(三个汽车同时移动)不同。

总结

  • 是的,初始计数为 2 时,代码允许两个 CarTask 任务同时运行(两个汽车同时移动)。
  • 但这不是“两个信号量同时进行”,而是一个信号量(g_xSemTicks)通过计数 2 控制了两个任务的并发执行。

2. 回答:一次 xSemaphoreGive(g_xSemTicks) 就可以释放这两个信号量吗?

  • 一次 xSemaphoreGive 的效果
    • 在 FreeRTOS 中,xSemaphoreGive 每次调用将信号量计数加 1(只要不超过最大计数,例如 3)。
    • 如果两个任务正在运行(计数为 0,因为初始计数 2 被两个 xSemaphoreTake 消耗),调用 xSemaphoreGive:
      • 计数从 0 增加到 1。
      • 这会唤醒一个阻塞的任务(例如第三个 CarTask),它通过 xSemaphoreTake 获取信号量(计数从 1 减到 0),开始运行。
    • 关键点
      • 一次 xSemaphoreGive 只增加计数 1 次,只能唤醒一个阻塞的任务(如果有)。
      • 它不会“释放两个信号量”或同时影响两个任务,因为信号量计数是逐次累加的。
  • 澄清“释放这两个信号量”
    • 你的表述可能误认为信号量计数 2 对应“两个信号量”,但信号量是一个单一对象,计数 2 只表示允许两个任务同时持有。
    • 两个正在运行的任务(已通过 xSemaphoreTake 消耗计数)不受 xSemaphoreGive 直接影响,因为它们已经持有了信号量。
    • xSemaphoreGive 的作用是增加计数,允许新的任务(例如阻塞的第三个任务)获取信号量。
  • 在你的代码中的行为
    • 假设初始计数为 2(xSemaphoreCreateCounting(3, 2)):
      • 两个 CarTask 运行(计数从 2 减到 0),第三个任务阻塞。
      • 第一个任务到达终点(pcar->x == g_xres - CAR_LENGTH),调用 xSemaphoreGive,计数从 0 增加到 1。
      • 第三个任务被唤醒,获取信号量(计数从 1 减到 0),开始移动。
      • 结果:一次 xSemaphoreGive 只唤醒一个阻塞的任务(第三个任务),不会“释放两个信号量”或同时唤醒多个任务。
    • 如果你希望一次释放后允许两个任务运行,需要连续调用两次 xSemaphoreGive(使计数达到 2),但你的代码中没有这种情况。
  • 如果没有阻塞任务
    • 如果没有任务阻塞(例如只有两个 CarTask 而不是三个),xSemaphoreGive 只会将计数增加到 1,没有其他任务会被唤醒。

总结

  • 一次 xSemaphoreGive(g_xSemTicks) 只会将信号量计数加 1,只能唤醒一个阻塞的任务(如果有)。
  • 它不会“释放两个信号量”或同时影响两个正在运行的任务,因为信号量计数是单次操作,且你的代码中一次只唤醒一个任务。
  • 如果你希望唤醒多个任务,需要多次调用 xSemaphoreGive 或调整信号量逻辑。

http://www.dtcms.com/wzjs/70638.html

相关文章:

  • 做网站还是app百度广告买下的订单在哪里找
  • 做网站的过程网店推广方案策划书
  • 学校网站建设流程中国十大电商平台
  • 网站大全软件百度推广一天烧几千
  • 免费建网站知乎国外网络推广
  • 百度网站优化软件精准营销包括哪几个方面
  • 建设银行给税对账在什么网站网站自然优化
  • 长沙营销型网站建设公司seo实战培训课程
  • 台州汇客网站建设百度关键词搜索排名代发
  • 网站制作 知乎百度空间登录
  • 上海做网站的公司排名搜索引擎优化排名工具
  • 什么网站可以接效果图做怎样做搜索引擎推广
  • 优化wordpress后台速度西安seo外包行者seo
  • 怎么用阿帕奇做网站百度指数怎么下载
  • 工程造价信息网官网信息价seo搜索优化是什么呢
  • 专业的建设企业网站网站制作费用
  • 网站建设中 html谷歌app下载 安卓
  • 如何做网站浏览pdf大兴今日头条新闻
  • 延庆长沙网站建设人力资源和社会保障部
  • 谷歌推广网站建设百度搜索引擎推广收费标准
  • 使用wordpress做图站美国搜索引擎排名
  • 网站建设从零开始青岛seo用户体验
  • 游戏抽奖网站用java怎么做网络营销师资格证
  • 东莞连衣裙 东莞网站建设百度搜索引擎优化方案
  • 诸城做网站建设的优速网站建设优化seo
  • 做公司网站需要准备什么百度一下电脑版
  • 网站404怎么做搜索引擎推广方法
  • 钟楼做网站市场调研报告最佳范文
  • 旅游网站开发结束语最近三天的新闻大事简短
  • 河南科技园网站建设今晚比赛预测比分