mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-06 16:56:45 +08:00
mmb force_push 出现竞争时,应该在失败后先正常push一次
This commit is contained in:
parent
2ea7535256
commit
8e6ae4220b
@ -376,10 +376,15 @@ 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);
|
||||||
}
|
}
|
||||||
// only one thread/process would touch here at one time
|
// only one thread/process would touch here at one time
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user