locking --- lock_guard + mutex
lock free --- atomic + CAS
wait free --- atomic +fetch_add
ring buffer-- producer makes progress without any wait, so wait-free.
using namespace std;
typedef unsigned long ulong;
ulong _shared = 123UL;
int main() {
{
ulong* p=nullptr; //locking
*p = _shared;
mutex M;
{
lock_guard<mutex> l(M);
++(*p);
}
}
atomic<ulong>* p=0; //lock free
*p = _shared;
ulong xl = p->load(memory_order_relaxed);
while (!p->compare_exchange_strong(xl, xl + 1, std::memory_order_relaxed)) {}
p->fetch_add(1, memory_order_relaxed); //wait free
// cache line is 64 bytes, ul is 8 bytes, so thread>8=> sit on separate cache line, no sharing faster.
return 0;
}
Wednesday, December 7, 2016
locking, lock free and wait free
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment