int val = memLoc[index++];
またはさらに良い
int val = memLoc[index++ & 0xFF];
各呼び出しが次の値を取得する共有リング バッファーからスレッドセーフな読み取りを実行しようとしています。TON が発生するため、可能であればロックを解放したいと考えています。Boost / C++ 11は許可されていません:(
int val = memLoc[index++];
またはさらに良い
int val = memLoc[index++ & 0xFF];
各呼び出しが次の値を取得する共有リング バッファーからスレッドセーフな読み取りを実行しようとしています。TON が発生するため、可能であればロックを解放したいと考えています。Boost / C++ 11は許可されていません:(
ここで同期が必要な唯一の操作は、index
値の増分です。これは単なる数値であるため、アトミック インクリメントを介してロックを使用せずに実行できます。リストした残りの操作は、共有場所の読み取りにすぎず、同期する必要はありません。
Win32 では、インクリメントを同期させるにはInterlockedIncrement
関数を使用します。
int oldValue = InterlockedIncrement(&index);
int val = memLoc[oldValue & 0xFF];
Linux で使用できるさまざまな同期インクリメント関数があります。このstackoverflowスレッドのオプションについてはかなり良い議論があります
アトミック操作でインデックスをインクリメントして読み戻す必要があります。残念ながら、++ 演算子は原子性を保証しません。
ほとんどのプロセッサには、使用できる何らかの種類の 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 またはそれ以下のタイプのアクセスが必要です。