Liam Huang

Results 240 comments of Liam Huang

@hiter123 引擎是 Hexo,模板是 NexT,服务器用的是 GitHub Pages 静态页面托管服务。

@muween 强表述版本要严格实现的话,并不容易。它对我实际工作来说,也没啥太大意义。所以我就不去写了。 另一方面:弱表述版本中,如果把 limit 设置为 1,interval 相应缩小,可以模拟出强表述的版本。所以也够用了。 如果想利用弱表述间接实现强表述也是可以的,做一层 wrapper 就好了。不过有不少细节需要小心处理。

> > @muween 强表述版本要严格实现的话,并不容易。它对我实际工作来说,也没啥太大意义。所以我就不去写了。 > > 另一方面:弱表述版本中,如果把 limit 设置为 1,interval 相应缩小,可以模拟出强表述的版本。所以也够用了。 > > 如果想利用弱表述间接实现强表述也是可以的,做一层 wrapper 就好了。不过有不少细节需要小心处理。 > > 我这里找到一个实现,但是不太理解它其中weight的意思,大佬可以看看嘛? > 首先我要说,这是一个非常脏的实现。这里 `window` 是一个 map 结构。它的查询本身是很慢的,再者我们没有机会去减小它的大小。也就是说,它会随着时间的推移,占据越来越多的内存,也会越来越慢。再就是,`window` 这个 map 本身要求线程安全。而保证一个 map 线程安全,难度还是很高的。太脏了。...

> @muween > 大佬太强了,我才看到回复。我一直没理解它滑在哪里了,原来是靠这。 > > > 如果想利用弱表述间接实现强表述也是可以的,做一层 wrapper 就好了。不过有不少细节需要小心处理。 > > 这细节有点多,我暂时还想不出要考虑哪些细节。。。 你先用弱表述版本去模拟强表述吧。比如你要 100QPS,那么 limit 你设置 1,interval 设置 10。比如你要 200 QPS,那么 limit 你设置 1,interval 设置 5。以此类推。 要 wrap 的话,比如你要...

@huawenqing 弱表述 limit = 1 的时候,就等价于强表述。强表述无非就是要求均匀性,limit = 1 了,肯定就均匀了。

@huawenqing 不会的。参见「第三次改进」上面最后一段。

@huawenqing 如果四个线程同时到达 1 处,那么他们的 ``ts`` 值相同,因此只可能有一个线程返回 true。这是原子操作保证的。因为一旦有一个线程返回 ``true`` 那么原子变量 ``timestamp_`` 被更新。其他线程只能返回 ``false`` 。

@huawenqing > 如果没有其他线程抢先修改 `timestamp_` 的值,那么 CAS 操作应该成功并返回` true`,继续执行后面的代码;否则,说明其他线程已经抢先修改了 `timestamp_`,当前线程的操作被记入上一个周期而被频率限制器拒绝。 文中已经写过了。

> > @huawenqing 如果四个线程同时到达 1 处,那么他们的 `ts` 值相同,因此只可能有一个线程返回 true。这是原子操作保证的。因为一旦有一个线程返回 `true` 那么原子变量 `timestamp_` 被更新。其他线程只能返回 `false` 。 > > 我写个了类似的程序,打印的时候,发现`ts`会跟着 `timestamp_ `更新,导致后面的线程返回`true`.... `ts` 的值是 `this->timestamp_.load()` 来的。如果四个线程同时到达 1 处,四个线程在 1 之前看到的 `timestamp_` 都是尚未被更新的同一个值,那么他们的...

@huawenqing `ts` 是栈上的变量,每个线程各自有一份,互不影响。 线程 2 执行 `this->timestamp_.compare_and_exchange_strong(ts, now)` 返回 `false` 时,会把 `timestamp_` 的现值(经由线程 1 的 CAS 操作更新后的 `timestamp_` 的值)写入当前线程的 `ts` 变量当中。这个没错,但不会修改线程 1/3/4 当中的 `ts`。 此时,线程 3 当中的 `ts` 依旧是旧值(即,线程 1...