<分区>
我们有一个支持二进制插件(动态加载库)的应用程序以及该应用程序的许多插件。应用程序本身是多线程的,插件也可以启动线程。为了保持数据结构的一致性,需要进行大量锁定。
一个主要问题是有时锁会在从应用程序到插件的调用之间保持。这是有问题的,因为插件代码可能想要回调到应用程序中,从而产生死锁。由于不同的团队在基础应用程序和插件上工作,这个问题变得更加严重。
问题是:除了编写大量纯文本之外,是否有一种“标准”或至少广泛使用的方式来记录锁定方案?
<分区>
我们有一个支持二进制插件(动态加载库)的应用程序以及该应用程序的许多插件。应用程序本身是多线程的,插件也可以启动线程。为了保持数据结构的一致性,需要进行大量锁定。
一个主要问题是有时锁会在从应用程序到插件的调用之间保持。这是有问题的,因为插件代码可能想要回调到应用程序中,从而产生死锁。由于不同的团队在基础应用程序和插件上工作,这个问题变得更加严重。
问题是:除了编写大量纯文本之外,是否有一种“标准”或至少广泛使用的方式来记录锁定方案?
最佳答案
这是一种理论方法,希望对您有所帮助。
对我来说,您可以通过重新设计插件和您的应用程序通信的方式(如果可能)来避免这种情况。
插件代码不安全。为确保应用程序的灵 active 和稳定性,您必须构建一种标准方式来交换信息并使用插件进行关键操作。
最简单的方法是通过定义无锁 api 来避免管理每个特定的插件行为。 为此,您可以通过使用环形缓冲区/干扰器或仅使用操作缓冲区来使插件的关键部分异步。
编辑
对不起,如果我以同样的方式再次争论,但这在我看来就像是一个“IO”问题。
您可以并发访问某些资源(内存/磁盘/网络......不知道是哪些)并且需要以高可用性公开它们。最后,如果不锁定您的应用程序,就无法随机访问这些资源。
有了专门负责关键部分的经理,等待时间可以短到几乎察觉不到。
然而,这并不容易适用于已经存在的应用程序,尤其是大型应用程序。
如果您还不知道这类东西,我鼓励您看看“干扰器”。对我来说,这是我每次使用线程时都要考虑的现代基础知识之一。
关于c++ - 多线程环境下的文档锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20609531/