Вы обнаружили еще один пример того, как C ++ делает сложную проблему из концептуально простой проблемы.
Похоже, что вы хотите, чтобы один или несколько производителей производили одинаковое количество значений и имели набор потребителейчитать и обрабатывать эти значения. Также кажется, что вы хотите, чтобы количество производителей было равно количеству потребителей, но при этом позволяете настраивать это число (производителей и потребителей).
Эта проблема очень проста с использованием Ada, который был разработан с параллелизмом вmind.
Первый файл - это спецификация пакета Ada, определяющая типы задач нашего производителя и потребителя.
generic
Items_To_Handle : Positive;
package Integer_Prod_Con is
task type Producer;
task type Consumer;
end Integer_Prod_Con;
Общий параметр очень похож на параметр шаблона. В этом случае значение, переданное в качестве универсального параметра, должно быть положительным целым числом. Реализация пакета следующая.
with Ada.Containers.Synchronized_Queue_Interfaces;
with Ada.Containers.Unbounded_Synchronized_Queues;
with Ada.Text_Io; use Ada.Text_IO;
package body Integer_Prod_Con is
package Int_Interface is new Ada.Containers.Synchronized_Queue_Interfaces(Integer);
package Int_Queue is new Ada.Containers.Unbounded_Synchronized_Queues(Queue_Interfaces =>Int_Interface);
use Int_Queue;
The_Queue : Queue;
--------------
-- Producer --
--------------
task body Producer is
begin
for Num in 1..Items_To_Handle loop
The_Queue.Enqueue(Num);
delay 0.010;
end loop;
end Producer;
--------------
-- Consumer --
--------------
task body Consumer is
Value : Integer;
begin
for Num in 1..Items_To_Handle loop
The_Queue.Dequeue(Value);
Put_Line(Value'Image);
delay 0.010;
end loop;
end Consumer;
end Integer_Prod_Con;
Пакет использует предопределенный универсальный пакет, реализующий неограниченную очередь в качестве буфера. Это позволяет очереди увеличиваться и уменьшаться по мере необходимости программой. Каждая задача производителя ставит в очередь целочисленные значения от 1 до Items_To_Handle, и каждый потребитель снимает с очереди и выводит одинаковое количество элементов из очереди.
Основная процедура для этой программы:
with Integer_Prod_Con;
procedure Int_Queue_Main is
PC_Count : constant := 3;
package short_list is new Integer_Prod_Con(10);
use short_List;
Producers : Array(1..PC_Count) of Producer;
Consumers : Array(1..PC_Count) of Consumer;
begin
null;
end Int_Queue_Main;
вывод этой программы:
1
1
1
2
2
2
3
3
3
4
4
4
5
5
5
6
6
6
7
7
7
8
8
8
9
9
9
10
10
10