Как избежать взаимоблокировки в разделяемой памяти (Тайм-аут мьютекса между процессами при блокировке. Возможная тупиковая ситуация: владелец умер без разблокировки?) - PullRequest
0 голосов
/ 21 мая 2019

У меня есть несколько процессов, запущенных в одной системе, и мне нужна какая-то "шина", чтобы иметь возможность передавать сообщения между ними.После некоторого рассмотрения я склоняюсь к общей памяти.Мне нужен какой-то механизм «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, но процесс-владелец мертв.

В то же время, если я удаляю переменные либо каждый раз, либо с какой-то временной блокировкой, тогда клиентский процесс остановится.Он больше не будет получать уведомления от новой именованной переменной условия.

Я делаю что-то явно неправильное или есть способ проверить, был ли удален определенный сегмент совместно используемой памяти?

Примечание: я не могу попытаться построить условную переменную в каждой итерации какон может пропустить уведомление из условной переменной.

...