Skip to content

Instantly share code, notes, and snippets.

@elvinio
Created December 4, 2014 06:02
Show Gist options
  • Save elvinio/60304c57242a67a22d64 to your computer and use it in GitHub Desktop.
Save elvinio/60304c57242a67a22d64 to your computer and use it in GitHub Desktop.
C++ Atomic Compare Exchange
struct BufferPos{
uint8_t write;
uint8_t read;
};
std::atomic<BufferPos> bufferPos;
--
Thread 1
BufferPos currPos = bufferPos.load(std::memory_order_relaxed);
BufferPos oldBufferPos = bufferPos.load(std::memory_order_relaxed);
BufferPos newBufferPos;
do{
newBufferPos.write = (oldBufferPos.write + 1) % ARRAYSIZE;
if(newBufferPos.write == oldBufferPos.read){
newBufferPos.write = (oldBufferPos.read + 1) % ARRAYSIZE;
}
newBufferPos.read = oldBufferPos.read;
}
while(!bufferPos.compare_exchange_weak(oldBufferPos, newBufferPos));
--
Thread 2
uint8_t counter = 0;
while(counter != 128){
BufferPos oldBufferPos = bufferPos.load(std::memory_order_relaxed);
BufferPos newBufferPos;
do{
newBufferPos.read = (oldBufferPos.read - 1) % ARRAYSIZE;
if(newBufferPos.read == oldBufferPos.write){
newBufferPos.read = (oldBufferPos.write - 1) % ARRAYSIZE;
}
newBufferPos.write = oldBufferPos.write;
}
while(!bufferPos.compare_exchange_weak(oldBufferPos, newBufferPos));
BufferPos currPos = bufferPos.load(std::memory_order_relaxed);
if(bufferPosToSeqNum[currPos.read] == seqNum){
std::memcpy(&destBuffer, &bufferArray[currPos.read*BUFFERSIZE], messageSize[currPos.read]);
return messageSize[currPos.read];
}
counter++;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment