idealvin / coost

A tiny boost library in C++11.
Other
3.91k stars 558 forks source link

请教一下Scheduler::next_scheduler #321

Closed eVen-p closed 1 year ago

eVen-p commented 1 year ago

请教一下SchedulerManager里面,判断 sched_num是否为2的x次方 的原因是什么呢?

以及next_scheduler()当中第三行 if (n <= ~_r) 设置这个if是出于什么考虑呢

Scheduler* next_scheduler() {
        if (_s != (uint32)-1) return _scheds[atomic_inc(&_n, mo_relaxed) & _s];
        uint32 n = atomic_inc(&_n, mo_relaxed);
        if (n <= ~_r) return _scheds[n % _scheds.size()]; // n <= (2^32 - 1 - r)
        return _scheds[now::us() % _scheds.size()];
}
uint32 _n;  // index, initialized as -1
uint32 _r;  // 2^32 % sched_num
uint32 _s;  // _r = 0, _s = sched_num-1;  _r != 0, _s = -1;

感谢赐教