У меня есть несколько процессов, запущенных в одной системе, и мне нужна какая-то "шина", чтобы иметь возможность передавать сообщения между ними.После некоторого рассмотрения я склоняюсь к общей памяти.Мне нужен какой-то механизм «boost :: signal2», чтобы иметь возможность передавать сообщения.Я не нашел простых решений этой проблемы, поэтому я начал экспериментировать с
boost::interprocess::named_condition
У меня есть следующий (серверный) код:
using boost::interprocess;
int main() {
// named_mutex::remove("hose horhez horatio");
// named_condition::remove("gabriel gabriellovich");
named_mutex mutex{open_or_create, "hose horhez horatio"};
named_condition cond{open_or_create, "gabriel gabriellovich"};
while (true){
scoped_lock<named_mutex>lock{mutex};
cond.notify_one();
}
return EXIT_SUCCESS;
}
И следующий (клиентский) код:
int main() {
named_mutex mutex{open_only, "hose horhez horatio"};
named_condition cond{open_only, "gabriel gabriellovich"};
while (true) {
scoped_lock<named_mutex> lock{mutex};
cond.wait(lock);
}
return EXIT_SUCCESS;
}
Моя большая проблема с кодом состоит в том, что если некоторые процессы будут убиты, на mutex
возникнет тупик, который я не могу устранить, поскольку только процесс владельца может разблокировать mutex
, но процесс-владелец мертв.
В то же время, если я удаляю переменные либо каждый раз, либо с какой-то временной блокировкой, тогда клиентский процесс остановится.Он больше не будет получать уведомления от новой именованной переменной условия.
Я делаю что-то явно неправильное или есть способ проверить, был ли удален определенный сегмент совместно используемой памяти?
Примечание: я не могу попытаться построить условную переменную в каждой итерации какон может пропустить уведомление из условной переменной.