Я бы реорганизовал твой код на твоем месте. Итак, есть некоторые задачи, которые взаимодействуют с другими задачами, теперь с 2 задачами. И есть связанный список, который отвечает за хранение задач и управляет вставкой / удалением задач. Это глобальный объект, который должен обрабатывать синхронизированный.
Вот почему я советую вам создать защищенный объект и сохранить в нем список задач. Защищенный типично используется для пассивных объектов, где некоторый ресурс должен обрабатываться синхронно. У вас могут быть такие процедуры, как вставка, удаление и т. Д. Это гарантирует, что одновременно будет выполняться только одно создание и удаление, а связанный список не будет противоречивым.
Каждая задача должна знать, что это «партнерские» задачи, которые могут измениться при вставке или удалении задачи. Я советую создать запись в задаче, которая обновит его соседей. Когда задачи приходят или уходят, защищенный объект обновляет соседей.
В этом случае нет необходимости обращаться к указателю «this», потому что защищенный объект организует все. Требуется только идентификатор, который может идентифицировать задачу (для удаления).
Я пытаюсь написать код, но у меня сейчас нет компилятора:
task type computer;
type computer_ptr is access all computer;
task type computer is
entry init(id:integer);
entry set_neighbor(left,right:computer_ptr);
end computer;
protected comp_list is
procedure insert; -- called by organizer
procedure remove(from:integer); -- called by task
private
type comp_list is array(integer range<>) of computer_ptr;
comps:comp_list(1..MAX):=(others=>null); -- or use own structure
end comp_list;
task body computer is
id_:integer;
left_n,right_n:computer_ptr:=null;
begin
accept init(id:integer) do
id_:=id;
end init;
while true loop
select
accept set_neighbor(left,right:computer_ptr) do
left_n:=left;right_n:=right;
end set_neighbor;
or
-- do its work
end select;
if (some_condition) then
comp_list.remove(id_);
break;
end if;
end loop;
end task computer;
protected body comp_list is
procedure insert is
p:computer_ptr;
begin
p:=new computer;
-- add to list -> nr;
p.all.init(nr);
-- call set_neighbor to its left and itself
end insert;
procedure remove(from: integer) is
begin
-- remove from list and get its neighbors
-- call set_neighbor regarding new ones
end remove;
end comp_list;