问题

  • 系统中有一些资源,需要在不同进程之间互斥使用

方案

  • 使用 boost::interprocess::sync 库里的 named_mutex 和 scoped_lock

新问题

  • 如果应用在 lock mutex 期间 crash,下次再尝试 lock 的时候,会陷入无限等待

原因

  • 刚开始以为是 named mutex 资源在进程退出的时候 OS 没有释放掉
  • 后来发现应该是因为 boost 的 named_mutex,不支持对 abandoned 状态的 mutex 的处理
  • 如果能自己编译 boost,应该有一些办法可以规避这个问题,但这不是我的情况

新方案

  • 听从建议,直接用 Windows 原生的 named mutex 吧

代码

class NamedMutex
{
public:
    NamedMutex(const std::string& name)
    {
        _mutex = ::CreateMutex(NULL, TRUE, ("Global\\" + name).c_str());
        if (::GetLastError() == ERROR_ALREADY_EXISTS)
            ::WaitForSingleObject(_mutex, INFINITE);
    }

    ~NamedMutex()
    {
        ::ReleaseMutex(_mutex);
        ::CloseHandle(_mutex);
    }

private:
    HANDLE _mutex;
}

int main(int argc, char** argv)
{
    ...
    {
        NamedMutex mutex("TheDarkKnight");
        ...
    }
    ...
}

其它