You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ada语言中delay语句是否会将对应进程置为阻塞状态?

Ada delay语句对任务状态的影响说明

你提到的进程/线程状态规则完全适用于Ada的任务场景,delay语句的不同参数对应不同的状态切换逻辑,具体如下:

两种delay语句的行为差异

  • delay <正时间值>(例如delay 1.0)
    执行该语句时,当前任务会直接进入阻塞状态,让出CPU调度权,直到设定的延迟时长耗尽后,才会重新进入就绪队列等待被调度。
  • delay 0.0
    这是Ada中定义的主动放弃当前时间片的特殊语法,不会让任务进入带超时的阻塞状态,只是触发一次主动调度:当前任务会从运行态切回就绪队列,排在同优先级所有就绪任务的末尾,调度器会优先执行其他同优先级的就绪任务。

示例代码行为说明

你给出的测试代码如下:

with Ada.Text_IO; use Ada.Text_IO;

procedure Two_Tasks is

     task Task_1;
     task Task_2;

     task body Task_1 is
     begin
      for I in 1 .. 10 loop
         Put_Line ("Visited task 1, iteration number" & Integer'Image (I));
         delay 0.0;
      end loop;
     end Task_1;
  
     task body Task_2 is
     begin
      for I in 1 .. 10 loop
         Put_Line ("Visited task 2, iteration number" & Integer'Image (I));
      end loop;
     end Task_2;

begin
   Put_Line ("Visited the main task");
end Two_Tasks;

该代码中Task_1的循环内加入了delay 0.0,实际运行时会观察到Task_1和Task_2的输出交替出现;如果移除这行delay 0.0,在两个任务优先级相同的前提下,大概率会出现其中一个任务连续输出完10次日志后,另一个任务才开始执行。

注意:上述状态切换都是针对进程内的单个任务(对应操作系统线程实体)的,只要进程内还有未结束的存活任务,整个进程本身不会进入阻塞状态。


你参考的进程/线程状态分类示意图:
进程/线程状态示意图

内容的提问来源于stack exchange,提问作者Stacking_Flow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:57:05