0

私は2つのスレッドを持っています(私はpthreadsGNU / Linuxで使用しています)。現在、彼らはグローバル変数を使用して情報を共有しています(私は知っています、それは良くありません)。各サイクルの終わりに、5つの変数(doubles)の値を他のスレッドに送信する必要があります。彼らの通信チャネルに一定の時間遅延を導入したいと思います、

すなわち

thread1(1kHz)<---> 10ms <---> thread2(1kHz)

私は、各サイクルで、値を読み取り、10ミリ秒間スリープし、それを他のスレッドに転送してから終了するスレッドを作成できると考えていました。これにより、システムはサイクルごとに2つのスレッドを作成します。1つは通信チャネルの各方向に1つです(1ミリ秒あたり2つのスレッド)。

通信の遅延をシミュレートする他のインテリジェントな方法はありますか?

更新:スレッドの通信を同期させたくありませんが、スレッド間に遅延を追加します。thread1が時間1sで何かを書き込んだ場合、他のスレッドは時間1s+10msでのみそれを読み取ることができるはずです。

4

4 に答える 4

1

これはパフォーマンスの問題とは思えないので、単純にしてください。複雑なデータ構造や余分なスレッドなどは必要ありません。

データの構造体を作成し、タイムスタンプ フィールドを追加します。

少なくとも 10 個の構造体を保持する配列を作成します。安全のために100を目指してください。ここでは多くのメモリを使用しないので、誰が気にします. 成長する必要があるときはいつでもmallocできます。

各スレッドには、そのような配列が 1 つと、配列内のアイテムの数があります。

スレッドがデータを送信する準備ができたら、次の 2 つのことを行います。

  1. 配列内の最初のアイテムのタイムスタンプを確認し、十分に古い場合はそのデータを他のスレッドに送信します。送信後、count をデクリメントし、配列内の残りの項目を 1 ノッチ下に memmove します。
  2. 現在/新しいデータを現在のタイム スタンプを持つ配列の末尾に追加し、カウントを増やします。

他のスレッドについて繰り返します。

于 2012-05-22T02:17:03.043 に答える
0

2 つのスレッド間の通信を同期するためにミューテックスを使用しないのはなぜですか?

最初のスレッドがデータを書き込む必要がある場合は、mutex を取得し (最初のスレッドがデータを更新している間、他のスレッドはデータを読み取れません)、datam を更新してから、mutex を解放します。もう一方のスレッドは、データを読み取るときに同様の取得/解放メソッドを実行します。

于 2012-05-21T17:13:59.417 に答える
0

ここでセマフォを使用しないのはなぜですか? セマフォで 1 つのスレッドを待機させ、クリティカル セクションで終了したときに他のスレッドにシグナルを送信させることができます。

于 2012-05-22T04:23:38.703 に答える
0

ライター スレッドとリーダー スレッド間の通信が信頼できるものである必要があるかどうかという質問からは、よくわかりません (たとえば、ライター スレッドによって送信されたすべてのメッセージは、リーダー スレッドによって正しい順序で表示されることが保証されています)。もしそうなら、そして共有データとして単一のグローバル構造を使用している場合は、基本的にバッファサイズが 1 の FIFO を実装しています。スレッド間通信を間違えやすいので、何かを調べることをお勧めします。 glib の非同期キューのように。独自のものをゼロから実装する必要がある場合は、そのコードを調べることから始めるのがよいでしょう。

于 2012-05-21T22:15:50.450 に答える