2011-07-26 9 views
1

基本的なAPIを公開し、アプリケーションの カップルで使用するマルチスレッドダイナミックライブラリがあります。現在、私はいくつかの基本的なスレッディングと同期プリミティブのカスタム(従来のように)実装を使用しています。このプリミティブでは、多大な柔軟性や機能を提供していないし、保守も面倒です(両方とも実装していますLinuxおよびWindows)。C++オブジェクトを動的にロードしてラッパーインターフェイスを使用する方法

これを既存のスレッドライブラリに置き換えたいと思いますが、いくつかの柔軟性を提供したいと思います。つまり、私が構築したさまざまなプラットフォームでどのように実行するかを見てみましょう私のライブラリは(私はboost :: thread、Poco :: Threadと新しいC++の0Xスレッドの実装を試してみたい)、もし望むなら自分のライブラリのカスタム実装に合わせてライブラリを提供することもできますライブラリとユーザーのアプリケーションが同じスレッドインフラストラクチャを使用できるようにすることができます。ユーザーが希望の実装を指定できるように、または既定で提供されているものを使用できるようにするには、設定ファイルなどが必要です。

私は、次のことを考えていました:

  • 、実行時に必要な実装に合わせて動的にクラスローダを使用しますマイライブラリ内で使用する薄いラッパー(PIMPLスタイル)を作ります。しかし、どうすればC++の0Xスレッドのケースを処理できますか?これらは標準ライブラリーにあり、ライブラリーに対して既にリンクされているので、実行時にカスタムをロードすることはできません。プロトタイプのデザインパターンと結合されたダイナミックローダーを使用している。しかし、このパターンでは、スレッドライブラリコードの変更を意味する、メソッドの実装が必要です。私はパターンをよく理解していないかもしれませんが、私はこれについて間違っているかもしれないので、間違っていれば私を修正してください。

あなたは私が今で動作するように多くのアイデアを持っていない(しかし、それはスタートだ)ので、次のいずれかのポインタが大きな助けになるだろう見ることができるように:

  • は、このようなAを提供されています機能は良いアイデアですか?あなたは注意点を見ますか?
  • ダイナミックローディング機能は実現可能なアイデアですか?何が欠点ですか? これを正しく実装するためのポインタ/リンクはありますか?
  • 「薄いラッパー」の方法では、ライブラリのAPIの一部として公開することをお勧めしますか?
  • 同じ種類の機能を実現するための選択肢やパターンがありますか(同じ結果が得られますが、動的ロードがないことを意味します)。
+0

マルチスレッド・プリミティブ(mutexes、semaphores、スレッド・ハンドルなど)は、特定のライブラリで実装されていない機能を補うために使用することもできます(ライブラリで提供されるmutexを使用してリーダ/等)があなたの図書館のAPIを通過しましたか?ライブラリで使用される基本的なスレッドプリミティブは、ライブラリのユーザに完全に隠されていますか? –

+0

"あなたのライブラリで使用されている基本的なスレッドプリミティブは、あなたのライブラリのユーザーに完全に隠されていますか?"それは私の質問の1つでした...スレッディングAPIも公開するのは意味がありますか?最初は、実行時にそれらを切り替えることができて嬉しいです。 – celavek

+0

@cevalek:私が言ったのは、ミューテックス、スレッドハンドルなどの**インスタンス**は、完全にライブラリによって管理され、ライブラリユーザには見えませんか? –

答えて

2

スレッディングソリューションの負荷を動的に、または遅延させる機能を提供するメリットは何ですか?理想的には、スレッド・ソリューションを選択し、APIインターフェースを持つライブラリーを作成し、ソリューションが不十分であると判明した場合は、同じインターフェースを使用して新しいライブラリーを作成することができます。私は静的にもDLLがうまくいますが、このようなライブラリをリンクすることを検討します。私はランタイムやそのようなものでそれを交換可能にする能力を気にしません。

ブーストスレッドを強くお勧めします。 POSIXをベースにしたクロスプラットフォームでは、さまざまな方法で実装するのが非常に簡単です。私は、C++ 0xスレッドはこの解決策に少し基づいていたと考えていますが、C++ 0xはすべてのコンパイラでファイナライズされていないか完全にサポートされていません。

+1

+1さまざまなスレッドライブラリはすべて、マルチスレッドのために同じオペレーティングシステムプリミティブを使用して終了します。 1つのスレッディングライブラリを選択してそれに固執することもできます。 –

+0

@Emile私はそれを理由として明示的に述べるべきでした。 – AJG85

+0

@Emile私は、ライブラリがマルチスレッドのために同じプリミティブを使用することになることを知っています。それはポイントではありません。私は実際に回避しようとしている "それを選んでそれに固執する"という状況にいるのです。私のライブラリはさまざまな要件とリソースを持つさまざまなシステムで使用され、boost :: threadは組み込みシステムにはあまりうまく適用されません(私は組み込みARM9プラットフォーム用にビルドしていませんし、 tはそのためのガイドを見つけました)、Poco :: Thread forはこのような状況で非常に優れています。 – celavek

1

スレッドライブラリのラッパーを用意し、実行時に初期化することで、最低限の分母に限定していると思います。つまり、スレッドライブラリ呼び出しのインターフェイスには、すべてのライブラリによって実装されている操作が含まれている必要があります。

これが受け入れられる場合は、Adapter Patternを使用して、ユーザーが選択したスレッドライブラリへの呼び出しを処理する必要があります。基本的には、configファイルを使用して、どのスレッドライブラリが使用中であるかを判断し、それをあなたのスレッド操作メソッドインタフェースを実装するアダプタクラスにラップし、その呼び出しを基底ライブラリの適切なメソッドに委譲します。

関連する問題