gpt4 book ai didi

concurrency - 任务不会同时运行

转载 作者:行者123 更新时间:2023-12-01 22:29:49 25 4
gpt4 key购买 nike

我怎样才能让这些任务并发运行,这样“Hello World from N”消息就会混淆?

除了 1、2 或 3 可以互换之外,我的输出看起来总是这样。

Hello World from 1!
Hello World from 2!
Hello World from 3!

这看起来不像是并发运行的任务。它看起来像是按照先到先得的原则在链中运行。

ma​​in.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;

最佳答案

使用 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 就不能工作,请尝试使用此延迟,因为它可能会导致程序寻找其他具有相同优先级的就绪任务来运行。不过,我不能保证任何事情。

关于concurrency - 任务不会同时运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29985211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com