【问题标题】:Hide Boost::mutex from DLL Interface from lockable Container从可锁定容器的 DLL 接口中隐藏 Boost::mutex
【发布时间】:2013-08-30 15:53:26
【问题描述】:

我一直在 DLL 项目中使用 Boost,但还没有导出任何 Boost 依赖项……。只是 C 类型和从 DLL 源代码树本身派生的东西。

但是现在我正在为一个可锁定的数据模型而苦苦挣扎……我无法让它设计异常安全,并且不直接将提升类型导出到 DLL 接口。

struct DLL_EXPORT DllTestData {
    double test1;
    double test2;

    void lock();
    void unlock();
    DllTestDataLock getGuard();

    boost::mutex;
}

并使用它:

DllTestData ptr;
ptr->lock();
ptr->test1 = 1.0;
ptr->unlock(); 

至少可以设计某种 DllTestData::Pimpl 并从 Dll 中隐藏互斥锁类型。但是如果我想这样使用它:

DllTestData ptr;
{
    auto g = ptr->getGuard();
    ptr->test1 = 1.0;
}

在写这篇文章时,我开始考虑一个 ILockable-接口并将互斥锁类型隐藏在 PImpl 或某种形式中,所以是这样的:

struct ILockable {
    void lock() = 0;
    void unlock() = 0;
}

struct DLL_EXPORT DllTestData : public struct ILockable {
    /// ...
private:
    class PImpl;
    Pimpl * impl;
}

struct Guard {
    Guard( ILockable * ptr ) {
        ptr->lock();
    }
    ~Guard() {
        ptr->unlock();
    }
}

并像这样使用它:

DllTestData ptr = fromDll();
{
    Guard g(ptr);
    ptr->test1 = 1.0;
}

这是一种有效的方法(使用 pimpl 隐藏互斥锁类型并使用 Lockable 接口)还是我走错了方向?或者在这种情况下什么会更好?也许将整个 boost::mutex PImpl 移动到接口?

【问题讨论】:

    标签: c++ boost dll mutex boost-mutex


    【解决方案1】:

    是的,在我看来,您走在正确的轨道上。但是你的结构是如此“沉重”,你应该将它作为一个接口导出,并使用值的 get 和 set 方法而不是值本身。如果您使用工厂模式,一个用于创建对象的函数和一个用于删除的函数,您可以安全地从您的 dll 中的接口派生,甚至不会暴露讨厌的 Pimpl * impl。

    再看一遍,您可以完全避免暴露互斥锁。例如,如果一次只设置两个值,则公开一个

    void setValues(double test1,double test2);
    

    在方法内部,您可以自己设置互斥锁。或者如果您不想要大的获取和设置列表,则可以使用更经典的 Win32 方法: 公开一个没有任何方法的结构,例如:

    struct DLLTestData
    {
    double test1;
    double test2;
    // …and as many as you want 
    };
    

    并为您的导出添加一个函数或方法,例如

    void setTestData(DLLTestData value);
    

    在您的库中,您可以锁定和 memcpy 整个结构。如前所述,在大量使用 Win32 API 的过程中,我习惯了第二种方式,但我个人更喜欢第一种方式,带有接口和 get/setter,即使它需要更多的努力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-21
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多