Я получаю сообщение об ошибке TASKING_ERROR в Ada - PullRequest
2 голосов
/ 07 мая 2020
• 1000 1001 *https://www.tutorialspoint.com/compile_ada_online.php.
with Ada.Text_IO;
use Ada.Text_IO;

procedure ConTasks is

    task type SimpleTask (Message: Character; HowMany:Positive) is
        entry Start_Running;
    end SimpleTask;

    task body SimpleTask is
    begin
        for i in 1 .. HowMany loop
            delay 0.1;
            Ada.Text_IO.Put_Line("Hello from task "&Message);
        end loop;
    end SimpleTask;

    task_a : SimpleTask('A', 5);
    task_b : SimpleTask('B', 7);
    task_c : SimpleTask('C', 4);


    begin
        task_a.Start_Running;
        task_b.Start_Running;
        task_c.Start_Running;
    end ConTasks;

Но когда я запускаю ту же программу в MinGW, я получаю ошибку ниже

C:\MinGW\bin>gcc -c Ada\ConTasks.ada
gcc: warning: Ada\ConTasks.ada: linker input file unused because linking not done

В онлайн-компиляторе я получаю правильный вывод, но, в конце концов, он показывает ошибку ниже.

Hello from task B
Hello from task A
.
.
Hello from task B
raised TASKING_ERROR

Ответы [ 3 ]

3 голосов
/ 07 мая 2020
with Ada.Text_IO;
use Ada.Text_IO;
procedure ConTasks is

    task type SimpleTask (Message: Character; HowMany:Positive);
    task body SimpleTask is
    begin
        for i in 1 .. HowMany loop
            delay 0.1;
            Ada.Text_IO.Put_Line("Hello from task "&Message);
        end loop;
    end SimpleTask;

    task_a : SimpleTask('A', 5);
    task_b : SimpleTask('B', 7);
    task_c : SimpleTask('C', 4);


begin
    null;
end ConTasks;
1 голос
/ 17 мая 2020
Ответ

@ Rudra Lad почти правильный, проблема в том, что, заключив l oop с accept, все это делается внутри рандеву, что означает, что Task и вызывающая задача одновременно вовлечены, поэтому вы не пользуетесь преимуществами параллелизма / параллелизма.

with Ada.Text_IO;
use Ada.Text_IO;
procedure ConTasks is

    task type SimpleTask (Message: Character; HowMany:Positive) is
        entry Start_Running;
    end SimpleTask;

    task body SimpleTask is
    begin
        accept Start_Running do
          null;
        end Start_Running;
            for i in 1 .. HowMany loop
                delay 0.1;
                Ada.Text_IO.Put_Line("Hello from task "&Message);
            end loop;
    end SimpleTask;

    task_a : SimpleTask('A', 5);
    task_b : SimpleTask('B', 7);
    task_c : SimpleTask('C', 4);


begin
    task_a.Start_Running;
    task_b.Start_Running;
    task_c.Start_Running;
end ConTasks;
0 голосов
/ 15 мая 2020

просто чтобы добавить к ответу Джима, вы можете использовать запись, если вы хотите контролировать, когда должна начинаться отдельная задача.

Это даст вам больше контроля над вашей задачей. Поскольку задачи без каких-либо записей начинают выполняться, как только вы выполняете двоичный файл.

with Ada.Text_IO;
use Ada.Text_IO;
procedure ConTasks is

    task type SimpleTask (Message: Character; HowMany:Positive) is
        entry Start_Running;
    end SimpleTask;

    task body SimpleTask is
    begin
        accept Start_Running do
            for i in 1 .. HowMany loop
                delay 0.1;
                Ada.Text_IO.Put_Line("Hello from task "&Message);
            end loop;
        end Start_Running;
    end SimpleTask;

    task_a : SimpleTask('A', 5);
    task_b : SimpleTask('B', 7);
    task_c : SimpleTask('C', 4);


begin
    task_a.Start_Running;
    delay 2.0;
    task_b.Start_Running;
    delay 2.0;
    task_c.Start_Running;
end ConTasks;
...