1
私は現在、プロシージャ内で2つのタスクを作成して、それぞれのプロシージャに渡される配列の数を追加しています。Outパラメータが定義されていません
私の一般的なパッケージには、次のようになります。
generic
type Item_Type is private;
with function "+"(Left: Item_Type; Right: Item_Type) return Item_Type;
package Parallel_Algorithms is
type Array_Type is array(Natural range <>) of Item_Type;
type Array_Access_Type is access all Array_Type;
procedure Parallel_Sum(Input: Array_Access_Type; Result: out Item_Type);
end Parallel_Algorithms;
私は実装が完璧ではないことを意識すること、Parallel_Sum
メソッドに以下の方法を実施し、またスレッドセーフ。
procedure Parallel_Sum(Input: Array_Access_Type; Result: out Item_Type) is
Loop_Var: Integer:= 0;
task type T;
Task1, Task2 : T;
task body T is
begin
while Loop_Var < Input'Length loop
Result := Result + Input(Loop_Var);
Loop_Var := Loop_Var + 1;
end loop;
end T;
begin
-- Result := Temp;
end Parallel_Sum;
私は今Result
の出力は常にその結果が明らかに間違っている(1,2,3,4)私の配列の内部の要素を考慮し1918988326.のようなものされて終わる私のメインプログラムを実行する場合。
アウトタイプを変更しないと、それぞれの変数の動作が未定義になることがあります。
「本当の」Result
を取得する適切な方法は何ですか?
あなたのタスク体ループはすべて間違っています。配列の長さにわたって、インデックス値の範囲を超えて反復していません。 –
パラメータを に変更できます。入力タイプは<>です。 これは、Input_Typeを整数型に強制します。 "+"関数を渡す必要はありません。 –
私はあなたが何を意味しているのか理解していますが、私は両方のタスクを開始し、それぞれが現在のインデックスの値を結果に追加することを考えました。これを行うことで、Loop_Varがリストの長さに等しい時点で完全な結果が得られ、ループはタスクと同様に終了するでしょうか? – hGen