Как срочно сообщить задание в Аде? - PullRequest
1 голос
/ 24 октября 2011

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

Ответы [ 3 ]

3 голосов
/ 24 октября 2011

Вы можете использовать Асинхронная передача управления и поместить часть, которую вы хотите остановить, в abortable_part, или напрямую использовать abort , чтобы убить задачу.

Если вы используете GNAT, вы можете взглянуть на пакет GNAT.Tasking.

2 голосов
/ 24 октября 2011

Как правило, лучше структурировать вашу последовательную логику с помощью «контрольных точек», таких как флаг защищенного объекта, где можно провести краткий тест, чтобы определить, есть ли сигнал для прерывания.Защищенные объекты предназначены для облегченного механизма параллелизма для поддержки такого быстрого теста.

Требуется ли действительно прерывание на любой точке в последовательности операторов?Является ли стоимость нескольких дополнительных микро- или миллисекунд, необходимых для завершения блока оператора или итерации, и делает проверку флага действительно такой неприемлемой?Как часто вы ожидаете отменить последовательность обработки?

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

1 голос
/ 24 октября 2011

Вы можете взглянуть на защиту любой операции или данных, реализовав ее внутри защищенного объекта .

Мне кажется, что вы ищете какую-то схему блокировки. Довольно просто реализовать все виды различных схем блокировки с объектами, защищенными Ada, и таким образом вам не требуется явное подтверждение связи между конкретными задачами.

...