cpp-ipc icon indicating copy to clipboard operation
cpp-ipc copied to clipboard

single-multi broadcast 模式下,生产者-消费者同步问题

Open cy2333ytu opened this issue 1 year ago • 1 comments

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来检查是否可以吗?

 if (el->rc_.compare_exchange_weak(
             cur_rc, epoch_ | static_cast<rc_t>(cc), std::memory_order_release)) {
     break;
}

compare_exchange_weaktrue,我理解的是:代表当前线程执行成功,为什么可以判断当前元素被所有消费者消费完毕呢以及为什么要给el->rc_ 赋值 epoch_ | static_cast<rc_t>(cc)

cy2333ytu avatar Jul 29 '24 11:07 cy2333ytu

时间太久了,我有点忘记当时的做法了。我记得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,细节有点忘记了。。

mutouyun avatar Aug 02 '24 06:08 mutouyun