У меня есть несколько процессов, но только один должен быть запущен одновременно. Это означает, что, скажем, Process1 запущен и, если Process2 запущен, то Process2 должен дождаться завершения Process1 . Я рассматриваю boost named_mutex для этой цели. Чтобы избежать сценария, в котором мьютекс может не освобождаться при возникновении какого-либо исключения, похоже, что boost :: lock_guard может быть полезным. Я придумал следующую упрощенную версию кода.
#include <iostream>
#include <boost/interprocess/sync/named_mutex.hpp>
#include <boost/thread.hpp>
#include <chrono>
#include <thread>
using namespace boost::interprocess;
#pragma warning(disable: 4996)
int main()
{
std::cout << "Before taking lock" << std::endl;
named_mutex mutex(open_or_create, "some_name");
boost::lock_guard<named_mutex> guard(mutex) ;
// Some work that is simulated by sleep
std::cout << "now wait for 10 second" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(10));
std::cout << "Hello World";
}
Пока все хорошо. Когда эта программа работает, я нажимаю Ctl + C, чтобы программа была прервана (симуляция сбоя программы, необработанное исключение и т. Д.). После этого, когда я запускаю приложение, программа зависает в следующей строке кода.
named_mutex mutex(open_or_create, "some_name");
boost::lock_guard<named_mutex> guard(mutex) ;
Если я изменю имя мьютекса, то оно будет работать нормально, не зависая. Однако, похоже, что мьютекс с именем some_name каким-то образом «запоминается» на машине в каком-то плохом состоянии. Это приводит к тому, что любое приложение, которое пытается получить мьютекс с именем some_name , зависает на этой строке кода. Если я изменю это имя мьютекса на « some_name2 », программа снова будет работать нормально.
- Может кто-нибудь объяснить, чем вызвано такое поведение?
- Как я могу сбросить поведение для этого конкретного мьютекса?
- Самое главное, как избежать этого сценария в реальном приложении?