C++ Actor Framework обрабатывает SIGINT

Мне трудно определить, как завершить работу системы акторов CAF, когда приложение получает сигнал SIGINT (^C). Я знаю о csignal, но он принимает функцию (не функцию класса и не лямбду), поэтому я не могу получить переменную act_system в области действия, чтобы отправить сообщение моим актерам.


person rkesters    schedule 24.09.2020    source источник
comment
Один из примеров обрабатывает SIGINT: github .com/actor-framework/actor-framework/blob/ По сути, вы устанавливаете атомарный флаг из обработчика сигнала и опрашиваете его с caf_main каждую секунду или около того (в промежутках между ними).   -  person parktomatomi    schedule 25.09.2020
comment
@parktomatomi здорово! Если вы сделаете этот ответ, я приму его.   -  person rkesters    schedule 25.09.2020


Ответы (1)


@parktomatomi уже упоминал этот пример в качестве ссылки: https://github.com/actor-framework/actor-framework/blob/5ead6f95182e1e2fee683de59579ef35f58588da/examples/curl/curl_fuse.cpp

Чтобы добавить немного больше контекста: причина, по которой пример опрашивает атомарное значение в цикле, связана с ограничениями, которые стандарты C и C++ налагают на обработчики сигналов. Здесь очень мало вещей, которые вы можете безопасно делать. В частности, выделение памяти небезопасно. Следовательно, мы не могли отправлять CAF-сообщения, даже если бы у нас был безопасный способ передать систему акторов обработчику сигналов. Установка флагов с помощью атомарных операций — одна из немногих безопасных вещей, которые можно сделать, но это означает, что вам нужно опросить этот флаг в другом потоке, чтобы вызвать какое-то полезное действие.

person neverlord    schedule 25.09.2020