Мне кажется, что вам здесь нужно агента А как-то дополнительно уведомлять о том, что вся работа сделана и он может самоубиться.
Например, можно попросить агента C прислать какое-то уведомление агенту А когда пачка обработана. Ведь вы же все равно как-то специально определяете момент завершения обработки пачки K дабы разрешить дерегистрацию A.
Можно даже использовать подход, при котором C вообще не нужно ничего самому отсылать. Делается это как-то вот так:
class completeness_notificator_t {
const so_5::mbox_t m_target; // Это и есть mbox агента A.
public:
completeness_notificator_t(so_5::mbox_t target) : m_target{std::move(target)} {}
~completeness_notificator_t() {
so_5::send<work_completed>(m_target);
}
};
После чего добавляете объект такого типа в сообщение с пачкой K. Когда это сообщение будет обработано (или проигнорировано), то агенту A автоматически будет отослано сообщение work_completed.
PS. На самом деле у completeness_notificator_t надо бы запретить копирование, а в деструкторе проверять m_target на пустоту и ловить исключения на всякий случай. Но принцип остается таким же.