C:抢占式调度中从低优先级线程读取共享变量

问题描述 投票:0回答:1

单核嵌入式系统

基于优先级的调度

线程 2(T2) - 高优先级

线程 1(T1) - 低优先级

单一生产者(T2)和单一消费者(T1)

要求:

  1. 数据通过共享循环缓冲区从T2流向T1。数据流 可能在一个方向,即 T2 到 T1。

  2. 计划使用循环缓冲区作为共享内存的线程之间 将收到的数据包从 T2 发送到 T1。

  3. T2 将入队,T1 将从循环缓冲区中将数据包出队。

  4. 并计划为循环缓冲区添加入队索引和出队索引指针作为易失性(认为它不会解决关键部分问题)。

  5. T2 将更新循环缓冲区和 T2 中的 Enqueue 索引指针 将更新循环缓冲区中的出队索引指针。

  6. T1线程将检查入队和出队索引之前是否相等 开始将数据包从循环缓冲区中出列。

查询:

  • 当 T1 线程(低优先级)尝试读取队列索引时,让我们说 该实例任务切换到高优先级线程 T2 并且它会更新入队索引变量?
  • 在这种情况下,任务再次切换到 T1,变量“入队索引”读取是否会给出旧值或无效值?
  • 我的理解是,对于我的要求,仅T2->T1方向 可能,所以这里关键部分问题不会出现在先发制人的情况下 日程安排

请发表你的看法

c multithreading embedded mutex critical-section
1个回答
0
投票

在标准 C 中(并且不指定嵌入方言),读取“排队索引”或任何其他共享变量不会强制线程调度。因此,线程 T1 可能会继续运行。它读取 T2 写入的last值。如果还没有写入值,则为未初始化内存的常规 C 读取,即未定义行为。 (不是“无效值”) 我不知道你为什么提到“关键部分问题”。

© www.soinside.com 2019 - 2024. All rights reserved.