Код: Выделить всё
void release(ptrdiff_t __update = 1)
{
if(0 < __a.fetch_add(__update, memory_order_release))
;
else if(__update > 1)
__a.notify_all();
else
__a.notify_one();
}
Код: Выделить всё
void acquire()
{
auto const __test_fn = [=]() -> bool {
auto __old = __a.load(memory_order_relaxed);
return (__old != 0) && __a.compare_exchange_strong(__old, __old - 1, memory_order_acquire, memory_order_relaxed);
};
__cxx_atomic_wait(&__a.__a_, __test_fn);
}
< /code>
Очевидный выбор, чтобы сделать приобретение синхронизированного с выпуском.void release(ptrdiff_t update = 1);
синхронизация: сильно случается перед вызовами try_acquire, которые наблюдают за результатом эффектов.
, прежде чем , более того, что synclerise с+ -э -э -э -э -э -э -э -э -э -э -э -э -э -э -э -э -э -э -э. says:
An evaluation A strongly happens before an evaluation D if, either
[*](12.1) A is sequenced before D, or
[*](12.2) A synchronizes with D, and both A and D are sequentially consistent atomic operations ([atomics.order]), или
< li>(12.3) Есть оценки B и C, так что A секвенирует до B, B просто случается до C, а C секвенировали до D, или
разработки. />
Я думаю, 12.2 было бы наилучшим образом подходит здесь, где a a fetch_add , d Compare_exchange_strong . , но в дополнение к синхронизации, они должны были быть SEQ_CST! Мы называем FETCH_ADD B и COMPARE_EXCHANGE_STRONG C. FINE, но где A и D THER? std :: barrier .
Я выбрал один (
Код: Выделить всё
std::semaphore
Подробнее здесь: https://stackoverflow.com/questions/632 ... before-for