2012-03-01 7 views
0

2つのスレッドを同期します。現時点では、私はロックとスワップするダブル回転汚れたバッファを使用しています。スレッドと読み書きメモリはバイトまたは安全ですか?

しかし私はこのことを、読み取りと同時に書き込みが発生するのを防ぐために行っています。データを伝達するために最上位ビットにフラグを格納することはできますか?または私は全バイトまで行くことができます。

たとえば、私はこれらの配列を持つことができ、多くの情報をboolの形で伝えることができます。読み取りと書き込みは、ハードウェアが同時に1つのビットを読み書きできないため、スレッドセーフです。だからガベージデータはありません。

これは実現可能ですか?これは原子タイプの全体の考えですか?

+0

はあなたのコードの一部を示してくださいすることができ:良い例えばこれを見たことがありますか?あなたが達成しようとしていることについての疑似コードでしょうか? – Gray

+0

何ですか?これは基本的なロジックです。コードは不要です。 – user936509

+1

少なくともこれを行うには、メモリの障壁が必要です。それはあなたのプログラミング言語に依存します。 – nos

答えて

0

はい私はあなたのフラグをテストするときに、アトミックテストを行い、書き込みが発生したことを示すフラグを設定するための比較またはスワップ操作をしたいと思うと思います。あなたの言語で適切なキーワード(例:揮発性または不可分)を確認するか、OSが提供する比較およびスワップ機能を使用する必要があります。

http://drdobbs.com/embedded-systems/210604448?pgno=1

+0

あなたの答えが正しく読まれなかった理由はわかりませんが、私はGoogleを使ってこれに着きました。いい答えだ。 – user936509

0

ご使用のプロセッサのアーキテクチャによって異なります。 32ビットアーキテクチャを使用している場合は、64ビットアーキテクチャの場合は32ビット値、次に64ビット値の場合は32ビット値が使用されます。プログラミング言語で使用するバイト、ビット、または16ビットのchar型を使用しているかどうかは関係ありません。プロセッサの容量(32ビットまたは64ビット)より小さいか等しい場合を除きます。

+0

原子変数のサイズについても説明しましたが、良い答えです。レジスタサイズ。ありがとう。 – user936509

2

2つのスレッド間で何らかの同期が必要です。データが汚れていることを示すためにビット、バイト、またはワードを使用したとしても、残りのバッファが同時に更新されたという保証はありません。スレッド間のバッファを更新するには、メモリバリアが必要です。

"アトミックアレイ"のようなものはありません。あなたは個々のバイトや単語を原子的に読み書きすることができますが、そのうちの2つがある瞬間に、操作はアトミックではありません。あなたのダーティーフラグはアトミックに更新できますが、スレッド間で共有される情報の追加バッファーがある場合は、バッファーを他のスレッドのメモリーに更新する必要があります。また

原子値の各アクセスは、火災にメモリバリアを引き起こすため、原子タイプ(volatile又はAtomic*)のアレイは、はるかあまり効率的はるかになるであろう。 1つのバッファとロックを現在のように同期させる方がはるかに効率的です。そうすれば、大量の小規模な更新で​​はなく、1つ(または複数の)メモリページを一度に更新することができます。また

、私はあなたがここに持っていると信じてプロデューサ/コンシューマモデルでは、消費者は生産が終了するまでにwait()に何かが必要になりますし、生産者は消費者から廃棄されたバッファを取得するために、何かにwait()にする必要があります。ロックを待つ(またはキューをブロックする - 以下を参照)ことは、これを達成するための効率的な方法です。ここで

消費者がキューで待機してから廃棄キューに廃棄されたバッファを追加することになりますので、blocking queuesのペアを使用しての代わりに、

  • を考慮すべきいくつかの他のもの。プロデューサーはその反対をするでしょう。
  • ByteBufferを見ましたか?
+0

私は、これらのアトミックなシングルビット型の形でスレッドからすべての情報を伝えることを意味します。ちょうど私がバッファを置き換えていることを明確にするために、原子タイプの半分だけが更新サイクルに関して適切な値を持っているかどうかは関係ありません。たとえば、1つのスレッドがアトミック配列の長さを書き込んでいるため、それらの一部が古い値を持つことがあります。 – user936509

+0

編集した投稿を破棄しました。 volatileキーワードは、必要なメモリの障壁を提供するのに十分なほど十分ではありません。 –

+0

ああ、私は@HansPassantを見る。彼は私が答えた後、彼のコメントを編集した。何らかの理由で彼が1バイトの情報を話していると思った。私は私の編集を削除します。ありがとう。 – Gray

関連する問題