We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
single-multi broadcast 模式,push function我的理解是:使用 epoch_ 以及 rem_cc来检查当前生产的元素是否被消费者们消费完毕,请问这样理解对吗,还有请问使用 epoch_ 来实现的逻辑该怎么理解呢?
同时我对以下代码感到疑惑
if ((cc & rem_cc) && ((cur_rc & ~ep_mask) == epoch_)) { return false; // has not finished yet }
只使用 cc&&rem_cc来检查是否可以吗?
cc&&rem_cc
if (el->rc_.compare_exchange_weak( cur_rc, epoch_ | static_cast<rc_t>(cc), std::memory_order_release)) { break; }
compare_exchange_weak 为true,我理解的是:代表当前线程执行成功,为什么可以判断当前元素被所有消费者消费完毕呢以及为什么要给el->rc_ 赋值 epoch_ | static_cast<rc_t>(cc)
compare_exchange_weak
true
el->rc_
epoch_ | static_cast<rc_t>(cc)
The text was updated successfully, but these errors were encountered:
时间太久了,我有点忘记当时的做法了。我记得epoch_ 是用来分代的,不过在这里,标记的其实是force_push,因为生产者只有一个,所以force_push的行为只会由唯一的那个生产者发起。当出现(cur_rc & ~ep_mask) != epoch_的情况,其实说明生产者由于等待超时而做了一次force_push,如果在push里只判断cc & rem_cc,那么队列中还剩多少元素,就得超时多少次。这里的cc应该是连接标记集合,每一位代表一个连接,因此只要cc & rem_cc的判断通过,就说明当前存活的连接都已经消费过这个元素了,因此compare_exchange_weak并不是用来判断的,单纯只是一次执行。至于这里为啥用compare_exchange_weak而不用store,我隐约记得是有一些corner case,细节有点忘记了。。
epoch_
force_push
(cur_rc & ~ep_mask) != epoch_
push
cc & rem_cc
cc
store
Sorry, something went wrong.
No branches or pull requests
single-multi broadcast 模式,push function我的理解是:使用 epoch_ 以及 rem_cc来检查当前生产的元素是否被消费者们消费完毕,请问这样理解对吗,还有请问使用 epoch_ 来实现的逻辑该怎么理解呢?
同时我对以下代码感到疑惑
只使用
cc&&rem_cc
来检查是否可以吗?compare_exchange_weak
为true
,我理解的是:代表当前线程执行成功,为什么可以判断当前元素被所有消费者消费完毕呢以及为什么要给el->rc_
赋值epoch_ | static_cast<rc_t>(cc)
The text was updated successfully, but these errors were encountered: