2012-02-28 18 views
5

私は、オーディオとビデオのキャプチャ、エンコーディング、多重化と書き込み用のスレッドを備えたビデオレコーダであるしばらくの間、マルチスレッドのC(Linux)アプリケーションを開発してきました。マルチスレッドCアプリケーションのフレームワークまたはパターン

私はpthread操作を使用してアドホックで一緒に投げ始めましたが、ロックやフラグ、シグナリングの設定と重複してポップアップするコードや状態のリファクタリングをサポートするように拡張しようとしています条件などが含まれます。

これまでのところ、私は作ってみたことは、このようなものである:各スレッドがミューテックスロックと二つの条件を持っている必要があり

  • - スレッドがやって終わった合図するために、スレッドや他の目を覚ますために1別のスレッドが待っている可能性のある作業
  • データキューは、特定のスレッドによって「所有」され、そのスレッドのロックを使用して保護されます。
  • 各スレッドは、「アクティブ」および「非アクティブ」の状態と、実行されたときにそれらと信号との間を移動することができるという概念を必要とします。

構造体に共通の要素を格納し、すべてのスレッドの開始、確認、および停止にループできる構造体の配列を持つことを計画しています。

これは一般的なスレッドサポートモデルに変わりました。私は車輪を革新的に再発明していると思っていましたので、私が適用しなければならない良い既知のパターンがあるかどうかここで尋ねます。

+1

[Glib](http://developer.gnome.org/glib/stable/)を見てください。 glib-core.html) –

+0

@AlexandreC。Glibについてよく分かりませんが、スレッドを抽象化して体重を増やすように見えます。スレッドインタラクションモデルを探しています。 – blueshift

答えて

4

あなたのアイデアは、QPステートマシンのフレームワークで実装されている多くのアクティブオブジェクトコンピューティングモデルを思い出させます。具体的には、QP/CおよびQP/C++フレームワークはPOSIX(Linux、BSDなど)に移植されています。ポートについては、アプリケーションノート「QP and Linux」(http://www.state-machine.com/linux/AN_QP_and_Linux.pdf)で詳しく説明しています。ここで

は、LinuxへのQPポートのハイライトです:

  • 各ステートマシンは、独自のpスレッドで実行されます。 mutexと条件変数で実装されたイベントキューのpスレッドブロック。イベントキューがイベントを受け取ると、スレッドはブロックを解除し、イベントはこのスレッドに関連付けられたステートマシンによって処理されます。 (これはよく知られているアクティブオブジェクトコンピューティングモデルです。)

  • イベントキューはアクティブオブジェクトスレッドによって所有されています。それは「アクティブ」または」非アクティブの状態を持つことができますので、

  • は、各スレッドは、全体の階層的なステートマシンを持っている。階層ステートマシン(UMLのステートチャートは)あなたがこれを再利用し、より高いレベルの状態とでアクションやトランジションを指定することができますこれは、従来のFSMでの状態遷移 "爆発"に対抗します。

+0

これは非常に興味深く関連しています、ありがとう! – blueshift

関連する問題