mmb force_push 出现竞争时,应该在失败后先正常push一次

This commit is contained in:
mutouyun 2021-01-09 21:42:56 +08:00
parent 2ea7535256
commit 8e6ae4220b

View File

@ -376,9 +376,14 @@ struct prod_cons_impl<wr<relat::multi, relat::multi, trans::broadcast>> {
} }
// just compare & exchange // just compare & exchange
if (el->rc_.compare_exchange_weak( if (el->rc_.compare_exchange_weak(
cur_rc, inc_mask(epoch | (cur_rc & ep_mask)) | static_cast<rc_t>(cc), std::memory_order_relaxed) && cur_rc, inc_mask(epoch | (cur_rc & ep_mask)) | static_cast<rc_t>(cc), std::memory_order_relaxed)) {
epoch_.compare_exchange_weak(epoch, epoch, std::memory_order_acq_rel)) { if (epoch == epoch_.load(std::memory_order_acquire)) {
break; break;
}
else if (push(wrapper, std::forward<F>(f), elems)) {
return true;
}
epoch = epoch_.fetch_add(ep_incr, std::memory_order_release) + ep_incr;
} }
ipc::yield(k); ipc::yield(k);
} }