2012-04-13 5 views
5

int val = memLoc[index++];次のコードロックをフリー/アトミックにすることはできますか?

またはいっそ

int val = memLoc[index++ & 0xFF];

各呼び出しは次の値を取得し、共有リングバッファから読み出さスレッドセーフをやろうとして - と私はロック自由になり、それをみたいのであれば可能な限りTONが起こります。いいえブースト/ C++ 11許可:(

+3

[この記事を読む](http://www.codeproject.com/Articles/43510/Lock-Free-Single-Producer-Single-Consumer-Circular)に興味があるかもしれません。 –

+3

C++ 11を使用しない場合は、事前標準のソリューションが必要です。 Boostが受け入れられない場合は、他のすべてのライブラリ(より厳しいライセンス条項を持つ)もおそらく外に出ているので、ポータブルなものを手に入れることはできません。だから、どのOSでこれが必要ですか? – MSalters

+0

どのタイプが 'memLoc'ですか? 'int'へのポインタ(または配列)ですか? –

答えて

6

ここで唯一の操作は、indexの値の増分です。これは単なる数値なので、アトミックな増分によるロックを使用せずに行うことができます。あなたが記載された操作の残りの部分は、ちょうど共有の場所の読み取りで、同期する必要はありません。Win32のはInterlockedIncrement機能で行われる同期の増分を作ることに

int oldValue = InterlockedIncrement(&index); 
int val = memLoc[oldValue & 0xFF]; 

が同期様々あります。 Linux上で利用可能なインクリメント機能。あなたがインクリメントし、アトミック操作でインデックスをリードバックする必要があると思います。このstackoverflowのスレッド

+2

C++ 11では、トリックを行うべきである 'std :: atomic_fetch_add'があります。 –

+0

'int'を書くことがアトミックにならないアーキテクチャはありますか(どこの要素を同期させる必要がありますか?) –

+0

@ MarkB問題は要素の原子書き込みだけではなく、すべてのプロセッサに渡って見えるように、古い値+の原子書込み+読み取りです。通常は、特別な指示が必要です。私の答えを見て、私はいくつかの場所で原子を誤用しました。それをきれいにするつもりです。 – JaredPar

1

のオプションのDの議論。残念ながら、++演算子はアトミック性を保証しません。

ほとんどのプロセッサには、使用できるフェッチインクリメントストア命令があります。それを行うためにインラインアセンブリを挿入することができます。あなたがWindows上で実行している場合http://en.wikipedia.org/wiki/Fetch-and-add

、MSはこれにアクセスするためのAPIを提供します:http://msdn.microsoft.com/en-us/library/windows/desktop/ms684122(v=vs.85).aspx

あなたは別のOSを使っている場合は、同様の機能がありそうです。しかし、いずれの場合でも、アトミックフェッチインクリメントストアを取得するには、OSまたはより低いタイプのアクセスが必要です。

関連する問題