Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost:如何监视互斥锁的状态并强制释放死锁_C++_Multithreading_Boost_Mutex - Fatal编程技术网

C++ boost:如何监视互斥锁的状态并强制释放死锁

C++ boost:如何监视互斥锁的状态并强制释放死锁,c++,multithreading,boost,mutex,C++,Multithreading,Boost,Mutex,可能重复: 我试图使用boost中的共享锁和唯一锁库对资源实现基本的读写器锁。但是,一些访问资源的线程可能会崩溃。我想创建另一个进程,在给定互斥体的情况下,该进程监视互斥体,并跟踪哪些进程锁定了资源以及每个进程拥有锁的时间。如果进程拥有锁的时间超过给定的时间段,该进程还将强制该进程释放其锁 任何关于如何解决这个问题的建议都将不胜感激 如果您强制保持锁的进程释放,那么您就破坏了锁的用途。想象一下,互斥锁psharedem->m保护对一些内存位的访问psharedem->mystuff pShar

可能重复:

我试图使用boost中的
共享锁
唯一锁
库对资源实现基本的读写器锁。但是,一些访问资源的线程可能会崩溃。我想创建另一个进程,在给定互斥体的情况下,该进程监视互斥体,并跟踪哪些进程锁定了资源以及每个进程拥有锁的时间。如果进程拥有锁的时间超过给定的时间段,该进程还将强制该进程释放其锁


任何关于如何解决这个问题的建议都将不胜感激

如果您强制保持锁的进程释放,那么您就破坏了锁的用途。想象一下,互斥锁
psharedem->m
保护对一些内存位的访问
psharedem->mystuff

pSharedMem->m.get_lock() ;
sleep( LONG_TIME ) ;

// wake up, not knowing that your "deadlock detector"
// has released your mutex

pSharedMem->mystuff++ ; // oh-oh... access to shared memory
                        // without the guarding mutex held.
                        // Who knows what will happen!

pSharedMem->m.release_lock() ; // you may very well trap or hit some
                             // system specific error because
                             // the mutex is no longer held.

(使用
get_lock()
release_lock()
明确写出,以明确突出锁定保持的范围)。

如果您强制保持锁定的进程释放,那么您就破坏了锁定的目的。想象一下,互斥锁
psharedem->m
保护对一些内存位的访问
psharedem->mystuff

pSharedMem->m.get_lock() ;
sleep( LONG_TIME ) ;

// wake up, not knowing that your "deadlock detector"
// has released your mutex

pSharedMem->mystuff++ ; // oh-oh... access to shared memory
                        // without the guarding mutex held.
                        // Who knows what will happen!

pSharedMem->m.release_lock() ; // you may very well trap or hit some
                             // system specific error because
                             // the mutex is no longer held.

(使用
get_lock()
release_lock()
明确写出,以明确突出锁定的范围)。

消除崩溃将是首选方法。针对崩溃的辅助带很少有好的结局。您应该将容易崩溃的代码段包装在
try-catch
块中,并尽可能释放关键资源。try/catch用于编程错误,而不是崩溃(除非您谈论的是Windows结构化异常处理,这是另一个beast)@PeeterJoot你完全正确:不知何故,我假设这些崩溃是意外的例外。如果是这样的话,采取一些预防措施并没有什么坏处,但事实上,线程本身崩溃的原因远不止是异常。服务器崩溃仍然可能发生,而且无法避免。@DavidItarenco给出的示例没有帮助,因为在崩溃时系统会得到SIGSEGV,并且不会调用析构函数,因此锁不会自动解锁,因为它超出了范围。消除崩溃将是首选方法。针对崩溃的辅助带很少有好的结局。您应该将容易崩溃的代码段包装在
try-catch
块中,并尽可能释放关键资源。try/catch用于编程错误,而不是崩溃(除非您谈论的是Windows结构化异常处理,这是另一个beast)@PeeterJoot你完全正确:不知何故,我假设这些崩溃是意外的例外。如果是这样的话,采取一些预防措施并没有什么坏处,但事实上,线程本身崩溃的原因远不止是异常。服务器崩溃仍然可能发生,而且无法避免。@DavidItarenco给出的示例没有帮助,因为在崩溃时,系统会得到SIGSEGV,并且不会调用析构函数,因此锁不会自动解锁,因为它超出了范围。是的,但是由于我们正在编写代码,我们知道每个进程不应该持有锁超过几千个周期。因此,最好有一个监控进程,以确保没有进程长时间持有锁。您是否使用实时调度保证运行?否则,(甚至可能是这样)您无法始终控制上下文切换和重新调度后不再分配cpu的原因。示例:由于突然出现不受监管的工作负载而导致系统活动激增,这会导致系统cpu利用率接近容量,导致重新调度时间出现很长的延迟。这一点很好,不,我没有任何调度保证。尽管如此,还是没有办法区分持有锁的进程是否只是在延迟还是通过SIGSEGV被杀死?是的,但是由于我们正在编写代码,我们知道每个进程持有锁的时间不应该超过几千个周期。因此,最好有一个监控进程,以确保没有进程长时间持有锁。您是否使用实时调度保证运行?否则,(甚至可能是这样)您无法始终控制上下文切换和重新调度后不再分配cpu的原因。示例:由于突然出现不受监管的工作负载而导致系统活动激增,这会导致系统cpu利用率接近容量,导致重新调度时间出现很长的延迟。这一点很好,不,我没有任何调度保证。尽管如此,还是没有办法区分持有锁的进程是简单地延迟还是通过SIGSEGV终止的?