Стандарт C ++ определяет порядок инициализации / уничтожения, когда все рассматриваемые переменные помещаются в один файл («единица перевода»). Все, что охватывает более одного файла, становится непереносимым.
Я бы поддержал предложения, чтобы Супервизор уничтожил каждый контроллер. Это потокобезопасно в том смысле, что только Супервизор приказывает кому-либо уничтожить себя (никто не уничтожает себя самостоятельно), поэтому нет расы. Вам также придется избегать любых тупиковых ситуаций (подсказка: убедитесь, что контроллеры могут уничтожить себя, как только им об этом сообщат, без необходимости что-либо от супервизора).
Можно сделать этот поток безопасным, даже если контроллер необходимо уничтожить до конца программы (то есть, если контроллеры могут быть недолговечны), тогда они (или кто-то еще).
Во-первых, это может быть не гоночное состояние, о котором стоит беспокоиться, если я решу уничтожить себя, а спустя микросекунду Супервизор решит уничтожить меня и скажет мне об этом.
Во-вторых, если вас беспокоит это состояние гонки, вы можете исправить его, скажем, требуя, чтобы все запросы на уничтожение проходили через Supervisor. Я хочу уничтожить себя. Я либо говорю Супервайзеру, чтобы он сказал мне, либо я регистрирую это намерение у Супервайзера. Если кто-то еще, включая Супервайзера, хочет, чтобы я был уничтожен, он делает это через Супервизора.