gpt4 book ai didi

c++ - boost:如何监控互斥体的状态并在死锁时强制释放 [2]

转载 作者:太空宇宙 更新时间:2023-11-04 14:12:49 25 4
gpt4 key购买 nike

我正在尝试使用 boost 的 shared_lock 和 unique_lock 库来实现资源上的基本读写锁。但是,一些访问资源的线程有可能简单地崩溃。我想创建另一个进程,给定一个互斥锁,监视互斥锁并跟踪哪些进程锁定了资源以及每个进程拥有锁的时间。如果进程持有锁超过给定时间段,该进程还将强制进程释放其锁。

尽管boost锁都是作用域锁,一旦超出作用域就会自动解锁,但如果服务器崩溃,它仍然不能解决我的问题,因此向进程发送SIGSEGV并杀死它。被杀死的进程不会调用它的任何析构函数,因此不会释放它持有的任何资源。

一个可能的解决方案是以某种方式在锁上放置一个计时器,以便进程在给定的锁定时间后强制释放锁。尽管这违背了锁定的概念,但它在我们的例子中是有效的,因为我们可以保证如果任何进程持有锁超过,比方说 5 分钟,那么可以很安全地说进程要么被杀死要么有陷入僵局。

非常感谢有关如何解决此问题的任何建议!


我之前的主题因“可能重复”而关闭,但所述重复问题并未回答我的问题。

boost: how to monitor status of mutex and force release on deadlock

最佳答案

先不管这是否是个好主意,您可以推出自己的互斥体实现,它利用共享内存来存储时间戳、进程标识符和线程标识符。

当线程想要获取锁时,它需要在共享内存中找到一个空槽,并使用原子测试和设置操作,例如 Windows 上的 InterlockedCompareExchange,如果当前值为空值,则设置进程 ID .如果集合没有发生,则需要重新开始。获取进程 ID 设置后,线程将需要重复线程标识符的过程,然后对时间戳做同样的事情(虽然不能只设置它,它仍然需要以原子方式完成)。

然后该线程将需要检查所有其他已填充的槽以确定它是否具有最低时间戳。如果不是,它需要记下具有最低时间戳的插槽,并轮询它直到它被清空、具有更高的时间戳或已超时。然后重复冲洗,直到线程拥有时间戳最旧的插槽,此时线程已获得锁。

如果另一个槽已超时,则线程应触发超时处理程序(这可能会杀死其他进程或简单地在具有锁的线程中引发异常),然后使用原子测试和设置操作来清除槽。

当带锁的线程解锁时,它会使用原子测试和设置操作来清除它的槽。

更新:还需要处理最低时间戳之间的关系以避免可能出现的死锁,并且处理死锁需要避免产生竞争条件。

关于c++ - boost:如何监控互斥体的状态并在死锁时强制释放 [2],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13350805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com