2011-01-25 8 views
0

私はCに高性能同期ジェネレータを書きたいと思っています。私はそれにイベントを送り、スレッドが重複を受け取らないように、複数のスレッドがポーリング/非同期に読むことができるようにします。Cのスレッドセーフ?

私は、同期が一般的にどのように行われているかについてはあまりよく分かりません。誰かが、私が使用できるかもしれない1つ以上のテクニックの高水準の説明を私に与えることができますか?

ありがとうございます!

答えて

1

スレッドセーフの主な概念は、Mutexです(しかし、異なる種類のロックがあります)。 複数のアクセスと競合状態からメモリを保護するために使用されます。 Linked Listを使用する場合

その使用の良い例があろう。 2つの異なるスレッドが同時に変更することを許可することはできません。あなたの例では、リンクリストを使用してキューを作成することができ、各スレッドはそこからいくつかのデータを消費します。

は明らかに他の同期メカニズムがありますが、これは(これまでで?)最も重要です。

あなたはより多くの実装の詳細についてthisページ(および下部に参照されたページ)を見ている可能性があります。

+0

ありがとうございました!私はこれが私が覚えておいたことを忘れていた概念だと思う。クライアントが別のマシンにある場合でもクライアントが別のスレッドにある場合と同じように動作させたいので、スレッドベースの同期がうまくいくかどうかは100%確信していません。 –

+0

あなたはあなたがしようとしていることと、あなたがそれをやろうとしていることについてより良いアイデアを持っているべきでしょう。あなたが同じマシン上に多くのクライアントを持っているとみなしても、別のスレッドや異なるプロセスを実行する必要がありますか?それは明らかではありません。 –

+0

私はアプリケーションがどのように配置されるべきかを正確に理解しています。ありがとう:) –

2

thread implementationが必要です。 Cにはマルチプロセッシングの概念が組み込まれていません。スレッドはしばしばライブラリとして実装される。このようなライブラリは、通常、複数のスレッドの実行、データ保護の方法などを同期させる方法を提供します。

+0

それは実装に依存しない方法で同期させることは不可能ですか?残りのアーキテクチャについてはまだ分かっていないので、私は尋ねるだけです。イベントがネットワークを介して引き出されるシステムモードが存在する可能性があるため、スレッド間ではなくマシン間で同期が行われる可能性があります。単一の親プロセス。これは大きな違いをもたらすのでしょうか? –

+0

あなたの2台の別々のマシンはメモリを共有していないので、ここでOKです。 –

+0

私はそれが理にかなっていると思います。この場合の同期は、TCPスタックまたはソケット処理コードにあります。 –

0

スレッド間に共有変数がある場合、スレッドセーフが問題になります。共有変数がない場合は問題ありません。すべてのイベントを読み取り専用にすることができ、ランダムにリスナーにディスパッチすることができます。

0

スレッドの安全性は、マルチスレッド実装が提供するすべての同期プリミティブを使用することによって実現されます。

あなたの開始点は、おそらくイベントのリンクリスト、それを保護するロックだろう、とすべてのスレッドは、ロックを取る最初のイベントへのポインタを調整することにより、一つのイベントを消費して、ロックを解除します。イベントを追加すると、リスト全体がロックされます。リストが空の場合、ワーカーは終了します。

そこから、様々な最適化が可能です。最後のイベントへのポインタをキャッシュ

  • 、そのリストにイベントを追加すると安くなります。
  • ワーカースレッドがリストが空のときにスリープできるように通知メカニズムを追加する。通常、これはという条件変数と呼ばれるものによって実現されます。
  • 複数のリストを使用するので、最初のリストがロックされている場合、ワーカーは現在リストをロックしているスレッドを待つことなく、別のリストからイベントを取得できます。
関連する問題