Saturday, March 31, 2018

Digest for comp.lang.c++@googlegroups.com - 2 updates in 2 topics

"Chris M. Thomasson" <invalid_chris_thomasson@invalid.invalid>: Mar 31 01:44PM -0700

Notice how there is an acquire barrier inside of the CAS loops within
the enqueue and dequeue functions of:
 
http://www.1024cores.net/home/lock-free-algorithms/queues/bounded-mpmc-queue
 
?
 
Well, fwiw we can get rid of them by using stand alone fences:
 
 
Btw, sorry for the membar abstraction. I can quickly get sick and tired
of having to type out (std::memory_order_relaxed) all the damn time. ;^)
 
 
Anyway, here is the simple code using Relacy:
 
___________________
/* Membar Abstraction
___________________________________________________*/
#define mbrlx std::memory_order_relaxed
#define mbacq std::memory_order_acquire
#define mbrel std::memory_order_release
#define mb(mb_membar) std::atomic_thread_fence(mb_membar)
 
 
template<typename T, unsigned int T_N>
struct fifo
{
struct cell
{
VAR_T(T) m_data;
std::atomic<unsigned int> m_ver;
};
 
std::atomic<unsigned int> m_head;
std::atomic<unsigned int> m_tail;
cell m_cells[T_N];
 
fifo() : m_head(0), m_tail(0)
{
for (unsigned int i = 0; i < T_N; ++i)
{
m_cells[i].m_ver.store(i, mbrlx);
}
}
 
bool push_try(T const& data)
{
cell* c = nullptr;
unsigned int ver = m_head.load(mbrlx);
 
do
{
c = &m_cells[ver & (T_N - 1)];
if (c->m_ver.load(mbrlx) != ver) return false;
 
} while (! m_head.compare_exchange_weak(ver, ver + 1, mbrlx));
 
mb(mbacq);
VAR(c->m_data) = data;
mb(mbrel);
 
c->m_ver.store(ver + 1, mbrlx);
 
return true;
}
 
bool pop_try(T& data)
{
cell* c = nullptr;
unsigned int ver = m_tail.load(mbrlx);
 
do
{
c = &m_cells[ver & (T_N - 1)];
if (c->m_ver.load(mbrlx) != ver + 1) return false;
 
} while (! m_tail.compare_exchange_weak(ver, ver + 1, mbrlx));
 
mb(mbacq);
data = VAR(c->m_data);
mb(mbrel);
 
c->m_ver.store(ver + T_N, mbrlx);
 
return true;
}
};
___________________
 
 
There is no need for any membars within the loops. The version count
keeps everything in order.
 
:^)
Andrey Karpov <karpov2007@gmail.com>: Mar 31 11:50AM -0700

A new version of the PVS-Studio analyzer 6.23 is working under macOS, which allows you to check the projects written in C and C++. Our team decided to perform a XNU Kernel check to coincide it with this event. https://www.viva64.com/en/b/0566/
You received this digest because you're subscribed to updates for this group. You can change your settings on the group membership page.
To unsubscribe from this group and stop receiving emails from it send an email to comp.lang.c+++unsubscribe@googlegroups.com.

No comments: