5

int val = memLoc[index++];

またはさらに良い

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

各呼び出しが次の値を取得する共有リング バッファーからスレッドセーフな読み取りを実行しようとしています。TON が発生するため、可能であればロックを解放したいと考えています。Boost / C++ 11は許可されていません:(

4

2 に答える 2

7

ここで同期が必要な唯一の操作は、index値の増分です。これは単なる数値であるため、アトミック インクリメントを介してロックを使用せずに実行できます。リストした残りの操作は、共有場所の読み取りにすぎず、同期する必要はありません。

Win32 では、インクリメントを同期させるにはInterlockedIncrement関数を使用します。

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

Linux で使用できるさまざまな同期インクリメント関数があります。このstackoverflowスレッドのオプションについてはかなり良い議論があります

于 2012-04-13T14:35:02.793 に答える
1

アトミック操作でインデックスをインクリメントして読み戻す必要があります。残念ながら、++ 演算子は原子性を保証しません。

ほとんどのプロセッサには、使用できる何らかの種類の fetch-increment-store 命令があります。これを行うには、インライン アセンブリを挿入できます。 http://en.wikipedia.org/wiki/Fetch-and-add

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

別の OS を使用している場合、同様の機能がある可能性があります。ただし、いずれにせよ、アトミック fetch-increment-store を取得するには、OS またはそれ以下のタイプのアクセスが必要です。

于 2012-04-13T14:41:50.987 に答える