【发布时间】: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