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
相关产品推荐
相关产品推荐

