and*_*dre 5 c++ windows mutex single-instance boost-interprocess
我想从切换CreatMutex到boost::interprocess::named_mutex限制我的应用程序的单个实例.当应用程序运行并且结束时,两种方法都有效.但是,当应用程序崩溃并使用时,锁定不会被释放boost::interprocess::named_mutex.我可以通过使用两个name_mutex解决该问题,但我真的不明白这个问题.
为什么boost::interprocess::named_mutex在应用程序崩溃但未释放时锁定未释放CreatMutex?有什么不同?
boost::interprocess::named_mutex mutex(boost::interprocess::open_or_create, "my_mutex");
boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(mutex, boost::interprocess::try_to_lock);
if(!lock) {
return 1; //exit
}
//application may crash here.
boost::interprocess::named_mutex::remove("my_mutex");
return 1; //exit
Run Code Online (Sandbox Code Playgroud)
警告:我没有花太多时间boost::interprocess,所以这些信息只是来自对源的快速检查.也就是说,我已经使用了Windows同步API了,所以这里......
两种进程间同步方法的主要区别在于对象在系统中的存在方式.
使用boost::interprocess::named_mutex,以及系统特定的互斥锁,看起来同步对象在系统上创建为文件.文件的位置基于注册表条目(参见注释1)(至少在Boost 1.54.0中)...它很可能位于Common Application Data文件夹下(参见注释2).当应用程序崩溃时,在您的情况下,此文件不会被删除.我不确定这是不是设计......但是在应用程序崩溃的情况下,最好不要乱用文件系统,以防万一.
相反,在使用时CreateMutex,会在内核模式下创建一个对象,对于命名的互斥锁,可以通过多个应用程序访问该对象.您可以通过在创建Mutex时指定名称来获取Mutex的句柄,并在调用时丢失句柄CloseHandle.当没有更多句柄引用它时,将销毁互斥对象.
其中重要的部分是在文档中:
当进程终止时,系统会自动关闭句柄.当最后一个句柄关闭时,互斥对象将被销毁.
这基本上意味着Windows将在您的应用程序之后进行清理.
请注意,如果您不执行a ReleaseMutex,并且您的应用程序在它死亡时拥有互斥锁,那么等待的线程或进程可能/可能会看到互斥锁已被放弃(WaitForSingleObject返回WAIT_ABANDONED),并且将获得所有权.
我为没有提供解决方案而道歉,但我希望它能回答你关于两个系统为何采取不同行为的问题.
另外,使用注册表项来获取此信息非常糟糕 - 使用它会更安全,更具前瞻性SHGetKnownFolderPath.但我离题了.
根据您的操作系统版本,这可能是%ALLUSERSPROFILE%\Application Data\boost.interprocess或ProgramData\boost.interprocess,或者完全是其他地方.
| 归档时间: |
|
| 查看次数: |
2655 次 |
| 最近记录: |