私は 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 -Interface について考え始め、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 全体をインターフェイスに移動しますか?