Nano Hash - криптовалюты, майнинг, программирование

Задачи не выполняются одновременно

Как я могу запустить эти задачи одновременно, чтобы сообщения «Hello World from N» были перепутаны?

Мой вывод всегда выглядит так, за исключением того, что 1, 2 или 3 можно поменять местами.

Привет, мир от 1!
Привет, мир от 2!
Привет, мир от 3!

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

main.adb

with Ada.Text_IO;

procedure Main is
   type Runnable_Type is access procedure;

   task type Filter (Runnable_Access : Runnable_Type) is
      entry start;
   end Filter;

   task body Filter is
   begin
      accept start;
      Runnable_Access.all;
   end Filter;

   procedure Run_1 is
   begin
      Ada.Text_IO.Put_Line ("Hello World from 1!");
   end Run_1;

   procedure Run_2 is
   begin
      Ada.Text_IO.Put_Line ("Hello World from 2!");
   end Run_2;

   procedure Run_3 is
   begin
      Ada.Text_IO.Put_Line ("Hello World from 3!");
   end Run_3;

   Filter_1 : Filter (Run_1'Access);
   Filter_2 : Filter (Run_2'Access);
   Filter_3 : Filter (Run_3'Access);
begin
   Filter_1.start;
   Filter_2.start;
   Filter_3.start;
end Main;
01.05.2015

  • Можете ли вы привести пример ожидаемого результата, например. вы ожидаете HHeHlloel WorWorld или подобное? Если это так, причина, по которой вы обычно этого не видите, заключается в буферизации строк в операционной системе или библиотеке времени выполнения Ada. 01.05.2015
  • @JackWhitham Хорошо, я тоже так думал. Но я не был уверен. Итак, задачи действительно выполняются одновременно в моем примере? 01.05.2015
  • Да. Если хотите, вы можете проверить это, добавив цикл и задержку к каждой процедуре. 01.05.2015

Ответы:


1

Использование Text_IO.Put_Line, скорее всего, приведет к тому, что вся строка будет записана за одну операцию, хотя вполне вероятно, что это могут быть две операции (одна для вывода символов в строке и одна для вывода новой строки). Но вызов ОС для вывода строки (возможно, без новой строки), вероятно, является одним вызовом, и операция ОС может быть непрерывной или может выполняться так быстро, что ее будет очень сложно прервать переключением потока. В любом случае, это, вероятно, не выводит по одному символу за раз. (Я предполагаю, что вы работаете в системе Linux или Windows или аналогичной, а не во встроенной системе с минимальным временем выполнения или тому подобное.)

Вы можете вывести один символ за раз самостоятельно:

procedure Output_String (S : String) is
begin
    for I in S'range loop
        Text_IO.Put (S (I));
        --delay 0.0;
    end loop;
    Text_IO.New_Line;
end Output_String;

а затем пусть ваши процедуры Run будут вызывать это вместо Text_IO.Put_Line. Если это не работает без delay 0.0, попробуйте вместо этого с этой задержкой, так как это может привести к тому, что программа будет искать другую готовую задачу с таким же приоритетом для запуска. Впрочем, я ничего не гарантирую.

02.05.2015

2

Задачи выполняются одновременно. Они просто не делают достаточно, чтобы этот параллелизм был виден. Добавьте больше работы к каждой задаче, например. многократно печатая строку текста, и вы это увидите.

01.05.2015

3

Как отмечает Джек, они выполняются одновременно. Это показывает размещение цикла занятости в разных частях процедуры Run_*.

with Ada.Text_IO;

procedure Main is
   type Runnable_Type is access procedure;

   task type Filter (Runnable_Access : Runnable_Type) is
      entry start;
   end Filter;

   task body Filter is
   begin
      accept start;
      Runnable_Access.all;
   end Filter;

   procedure Run_1 is
      counter : integer := 0;
   begin
      for i in 1..1000000 loop
         counter := counter + 1;
      end loop;
      Ada.Text_IO.Put_Line ("Hello World from 1a!");
      Ada.Text_IO.Put_Line ("Hello World from 1b!");
      Ada.Text_IO.Put_Line ("Hello World from 1c!");
   end Run_1;

   procedure Run_2 is
      counter : integer := 0;
   begin
      Ada.Text_IO.Put_Line ("Hello World from 2a!");
      for i in 1..1000000 loop
         counter := counter + 1;
      end loop;
      Ada.Text_IO.Put_Line ("Hello World from 2b!");
      Ada.Text_IO.Put_Line ("Hello World from 2c!");
   end Run_2;

   procedure Run_3 is
      counter : integer := 0;
   begin
      Ada.Text_IO.Put_Line ("Hello World from 3a!");
      Ada.Text_IO.Put_Line ("Hello World from 3b!");
      for i in 1..1000000 loop
         counter := counter + 1;
      end loop;
      Ada.Text_IO.Put_Line ("Hello World from 3c!");
   end Run_3;

   Filter_1 : Filter (Run_1'Access);
   Filter_2 : Filter (Run_2'Access);
   Filter_3 : Filter (Run_3'Access);
begin
   Filter_1.start;
   Filter_2.start;
   Filter_3.start;
end Main;

Выход:

Hello World from 2a!
Hello World from 3a!
Hello World from 3b!
Hello World from 2b!
Hello World from 2c!
Hello World from 1a!
Hello World from 1b!
Hello World from 1c!
Hello World from 3c!
07.05.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..