Open cy2333ytu opened 3 months ago
时间太久了,我有点忘记当时的做法了。我记得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,细节有点忘记了。。
single-multi broadcast 模式,push function我的理解是:使用 epoch_ 以及 rem_cc来检查当前生产的元素是否被消费者们消费完毕,请问这样理解对吗,还有请问使用 epoch_ 来实现的逻辑该怎么理解呢?
同时我对以下代码感到疑惑
只使用
cc&&rem_cc
来检查是否可以吗?compare_exchange_weak
为true
,我理解的是:代表当前线程执行成功,为什么可以判断当前元素被所有消费者消费完毕呢以及为什么要给el->rc_
赋值epoch_ | static_cast<rc_t>(cc)