【发布时间】:2021-09-12 15:21:57
【问题描述】:
summing up elements of a C++ vector 有多种方式,但如何“原子地”保证这一点?在求和动作期间,向量的元素可能被其他线程修改,导致未知结果。有没有一种无锁的方式来防止向量被修改,直到求和完成?
【问题讨论】:
-
你能给出一个场景,你可以计算一个过时的向量总和,这个向量(看起来)被其他线程严重改变了?为什么需要无锁?
-
如果向量很大,那么任何“真正的原子”操作都可能对操作系统产生可怕的后果。
-
不,没有。根据定义,任何阻止向量被修改的东西都是锁。
-
我正在多线程上下文中实现滑动窗口限制器。它是通过向量实现的。当一个请求来的时候,我需要对vector求和,判断是否接受当前的请求,如果接受,就会做vector[index]++。
-
另一种选择是保持流动总和。然后问题将转移到拥有一个原子(且无锁)
+=,并确保线程保持更新总和。当然,这只有在总和的变化率不高于读取总和的频率时才有意义。
标签: c++ multithreading c++11 vector thread-safety