2011-03-16 5 views
6

私はマルチスレッドの経験があまりなく、私は2つのスレッドで実行するのに適していると思われるCプログラムを作成しています。プログラムはシリアルポートでデータを受信し、利用可能な場合は新しいデータを読み込んで処理し、サードパーティのIPC api(紛らわしい名前のIPC)を介して最新の処理済みデータを他の(無関係な)モジュールに公開します。マルチスレッド化されたCプログラムの設計ヘルプ

IPC経由でデータを公開する要求を受信するには、IPC_listenwait(wait_time);を呼び出す必要があります。次に、 "listenwaiting"中に発行する要求が受け取られた場合、最新のデータを公開するためにハンドラが呼び出されます。

一つのオプションは以下のように1つのスレッドでこれを行うことです。

for(;;) { 
    read_serial(inputBuffer); 
    process_data(inputBuffer, processedData); //Process and store 
    IPC_listenwait(wait_time); //If a request to publish is received during this, 
}       //then a handler will be invoked and the newest piece of   
          //processedData will be published to other modules 

publishRequestHandler() { //Invoked when a message is received during IPC_listenwait 
    IPC_publish(newest(processedData)); 
} 

そして、これは動作しますが、アプリケーションのためには、プログラムが新しいデータを公開する要求に非常に敏感であることが重要であり、その公開されたデータは最新のものです。これらの目標は、プロセスがリッスン待機を開始した後で、メッセージの発行要求が受信される前にデータが到着する可能性があるため、上記には満足していません。または、メッセージを発行する要求が着信したときにプロセスが読み取り/処理されている可能性がありますが、次のIPC_listenwaitコールまでサービスを処理できません。ただ、着信メッセージをリッスン

readThread() { 
    for(;;) { //pseudocode 
     select(); 
     read(inputBuffer); 
     process(inputBuffer, processedData); 
    } 
} 

そして、メインスレッドを持っている:

mainThread() { 
    IPC_listenwait(forever); 
} 

publishRequestHandler() { //Invoked when a message is received during IPC_listenwait 
    IPC_publish(newest(processedData)); 
} 
私は考えることができる

唯一のデザインは、単にような何かをします読み込むためのスレッドを1つ、持っていることです

これは使用するデザインですか?その場合は、processedDataにアクセスしたり書き込んだりする際にセマフォを使用する必要がありますか?

これは私に良い応答を与えますか?

おかげ

答えて

4

あなたは正しい軌道に乗って、ほとんどです。

あなたが気を付けなければならないことの1つは、別のスレッドが読んでいる間にスレッドを壊したくないため、公開可能なデータへの同時アクセスです。これを防ぐには、現在のバッファとミューテックスで保護されたポインタのペアを使用してください。 process_data()に何か準備ができたら、その結果を非カレントバッファにダンプし、ポインタミューテックスをロックし、ポインタを新しいデータを含むバッファに再指名してからミューテックスを解放する必要があります。同様に、パブリッシャはポインタミューテックスを現在のデータを読み取っている間ロックする必要があります。これは、ミューテックスで保護された単一のバッファを持つよりも少し複雑ですが、新しいデータが準備されている間、常に最新のものを公開することを保証します。

複数のデータセットを読み取るのに十分な処理時間がかかる場合は、読み取り/処理スレッドを2つに分割し、プロセッサーが最新かつ最大のものしか取得できないようにしますあなたがこれまで公開していないものを処理することになります。

優秀な最初の質問です。 upvoteをしてください。

+0

ああ、2つのバッファソリューションはシンプルですが、天才です!ありがとう –

関連する問題