C++ 多线程插件体系结构中的共享、单边可变状态

C++ 多线程插件体系结构中的共享、单边可变状态,c++,multithreading,c++11,synchronization,c++14,C++,Multithreading,C++11,Synchronization,C++14,我有一个应用程序,它有一个非常简单的插件系统,它围绕着一个核心构建,负责繁重的工作,但将任何超出基础的处理留给插件。现在我想让这个系统多线程,或者至少允许各个插件运行自己的线程,这样它们就可以在不冻结内核的情况下单独阻塞 当然,这意味着使核心线程安全,这样插件就可以自由操作所述核心的线程安全成员函数。对于许多情况来说,这并不难,但当这些成员函数中的一个函数的结果是(const)对内核维护的某个内部环境的引用时,问题就出现了。插件不能修改它,但是在另一个线程中运行的核心可以在插件仍然保持引用并且可

我有一个应用程序,它有一个非常简单的插件系统,它围绕着一个核心构建,负责繁重的工作,但将任何超出基础的处理留给插件。现在我想让这个系统多线程,或者至少允许各个插件运行自己的线程,这样它们就可以在不冻结内核的情况下单独阻塞

当然,这意味着使核心线程安全,这样插件就可以自由操作所述核心的线程安全成员函数。对于许多情况来说,这并不难,但当这些成员函数中的一个函数的结果是(const)对内核维护的某个内部环境的引用时,问题就出现了。插件不能修改它,但是在另一个线程中运行的核心可以在插件仍然保持引用并且可能仍然处于中间处理的任何时间点更新它

现在,我可以在核心中公开一个互斥体,让插件锁定它,只要它们需要数据保持不变,但是由于互斥体将不得不阻止核心事件处理,长时间持有它将导致各种各样的不愉快。我真的想避免这样

另一种解决方案可能是使用返回引用的函数,而不是返回副本,但是环境可能会变得相当大,因为有许多容器包含更多的内容,而复制所有这些内容的成本很高

除了指导cleer进行任何直接共享,而是通过插座或管道进行讨论之外,这些似乎是我的选择,尽管我无法决定我会选择哪一个


哪一个是我最好的选择?哪些我没有考虑过的选项可能会对我有所帮助?

这个问题是基于观点的,但根据过去的经验,我建议使用书面复制。您可以在顶层复制整个对象,也可以一块一块地复制,这可能会解决复制的开销。例如:

struct BigData;
struct Shared
{
    std::shared_ptr<const BigData> a;
    std::shared_ptr<const BigData> b;
    std::shared_ptr<const BigData> c;
}
structbigdata;
结构共享
{
std::共享的ptr a;
std::共享的ptr b;
std::共享的ptr c;
}

然后,您将只复制您修改的部分,并将
Shared
的副本发送到插件。因此,如果在
a
中更改某些内容,
b
c
仍将指向同一个对象,但
a
将指向一个新的
BigData
,该对象是从原始对象复制然后修改的。

内部组件是否可以是共享指针,函数是否返回共享指针?如果你能做到这一点,那么你可以编写你的核心代码,如果共享指针的引用计数大于1,那么你就不能修改它。复制似乎是正确的方法,因为它免除了你很多共享访问的麻烦,但是如果插件需要“实时”访问数据(更改),这可能并不理想——您没有指出插件的内存访问的性质可能有助于做出决定。