Мне нужно синхронизировать ряд goroutines 1..n
, которые запускают код на интерпретируемом языке (записан в Go) в критической секции интерпретируемого кода, выполняемой в goroutine k
, которая может быть любой из 1..n
во время выполнения. То есть, если код в k
выполняется в критической секции, все другие процедуры i (i≠k; 1≤k,i≤n)
должны быть приостановлены до завершения k
. Решение также должно иметь дело с ошибочным вложением критических секций, либо путем обработки на самом внешнем уровне, либо путем сообщения об ошибке.
Проблема заключается в том, что каждая из этих программ может выполнять код с жесткой l oop и я не имею прямого контроля над этим кодом - он интерпретируется, предоставлен пользователем. Вещи, которые я рассмотрел:
Напутайте с переводчиком, чтобы включить какую-то доходность или чеки. Это кажется очень неэффективным способом борьбы с этим. Язык допускает рекурсию, поэтому мне придется проверять каждый вызов функции.
Приостановить выполнение подпрограмм i
, пока они работают, из k
не по совместительству? Можно ли приостановить goroutine в Go «извне (=k
)»?
Предоставить способ на целевом языке для совместной проверки, k
работает и останавливается при необходимости. Я не хочу этого делать, так как это в основном утечка абстракции для каналов. Это также усложнит программирование, и я хочу, чтобы мой интерпретируемый язык оставался простым.
Что бы вы порекомендовали. Возможен ли вариант 2? Есть ли другой способ сделать это? Любая помощь с благодарностью!