Как избежать сценария, когда Process2 продолжает ждать, пока Process1 выпустит named_mutex - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть несколько процессов, но только один должен быть запущен одновременно. Это означает, что, скажем, Process1 запущен, и если Process2 запущен, то Process2 должен дождаться завершения Process1 . Я рассматриваю boost named_mutex для этого с кодом, как показано ниже.

#include <iostream>
#include <boost/interprocess/sync/named_mutex.hpp>

using namespace boost::interprocess;

int main()
{
    named_mutex mutex(open_or_create, "some_name");

    try
    {
        mutex.lock();

        // Do work

        mutex.unlock();
    }
    catch (const std::exception& ex)
    {
        mutex.unlock();
        std::cout << ex.what();
    }
}

Вопросы:
1. Я хотел бы убедиться, что не существует ситуации, когда Process2 лишается возможности получить блокировку, если Process1 встречает какое-либо обработанное / необработанное исключение?
2. Есть ли в c ++ механизм finally, похожий на c #, который может быть полезен в этом сценарии использования?

1 Ответ

1 голос
/ 21 апреля 2019

Наконец, в C # есть процедурная эмуляция RAII.Поскольку переменные автоматического хранения имеют детерминированный срок жизни в C ++ (с точки зрения области видимости), просто выполните разблокировку в деструкторе.

Тип библиотеки std - unique_lock;Boost будет похожим.Имейте эту блокировку мьютекса и разблокируйте при уничтожении.

...