pragma Task_Dispatching_Policy(Non_Preemptive_FIFO_Within_Priorities) 的使用示例;

Usage example of pragma Task_Dispatching_Policy(Non_Preemptive_FIFO_Within_Priorities);

我有一个大型的、面向任务的程序,我想探索变体调度程序策略。我正在使用 Gnat Ada 2020。特别是,我想通过使用编译指示来设置任务模型:

pragma Task_Dispatching_Policy(Non_Preemptive_FIFO_Within_Priorities);

我觉得我不太了解实际的用法。我了解编译指示的作用,但至少根据 GNAT 的说法,我很难正确放置编译指示。对于以下小程序中的各种放置组合,我总是得到错误: “配置 pragma“Task_Dispatching_Policy”的位置不正确 我已经在整个编译单元之外、任务类型规范内、任务主体规范内等进行了尝试。任何人都可以向我展示这个 pragma 的用法示例吗?谷歌搜索发现很多讨论,但在源代码中没有实际使用示例。提前致谢。

with Ada.Text_IO; Use Ada.Text_Io;
 
procedure Test is

   Task Type One is
   End;  

   Task Type Two;

   Task body One is
   Begin
     Loop
       Put_line("Task one 11111111111111111");
     End Loop;
   End;

   Task body Two is
   Begin
     Loop
       Put_line("Task two 2222222222222222");
     End Loop;
   End;

  a : One;
  B : two;
begin
  Null;
End;

如下所述,我在UG中发现了一些关于将pragma放在'gnat.adc'文件中的东西,这似乎生效但并没有完全阻止切换,这是我所期望的。我应该提到我在 Windows 10 环境中。

我认为这是通过@egilhh 的评论回答的。如果他发布一个我能够接受的帖子,我会很高兴接受他的。

I am having difficulty placing the pragma correctly.

注意正确放置,注意 Task_Dispatching_Policy pragma is a configuration pragma that must "appear before the first compilation_unit of a compilation。"

at least according to GNAT.

作为@egilhh , the GNAT User Guide describes how tp accomplish this in 3.4.1. Handling of Configuration Pragmas:

Configuration pragmas may either appear at the start of a compilation unit, or they can appear in a configuration pragma file to apply to all compilations performed in a given compilation environment.

在单个编译单元的情况下,只需将 pragma 放在第一个上下文子句之前,如图 :

pragma Task_Dispatching_Policy(…);
with Ada.Text_IO; use Ada.Text_IO;
…

要更广泛地应用 pragma,请将其添加到 gnat.adc,如 §3.4.2. The Configuration Pragmas Files 中所述。