私はマルチスレッドの経験があまりなく、私は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にアクセスしたり書き込んだりする際にセマフォを使用する必要がありますか?
これは私に良い応答を与えますか?
おかげ
ああ、2つのバッファソリューションはシンプルですが、天才です!ありがとう –