【发布时间】:2015-09-10 19:33:42
【问题描述】:
有没有办法同步访问分配的内存中的每个元素。例如,如果我使用以下代码分配内存
int* counters = new int[10];
有没有办法分别同步修改每个计数器(能够同时修改 counters[0]、counters[1]...counters[9])以便修改,比如说,counters[ 0] 不会阻塞 counters[9] 直到释放锁以更新 counters[9] 和其他计数器,而线程正在更新特定计数器 counters[0]?这些计数器不相关且不依赖于与其他计数器的任何共享数据?
【问题讨论】:
-
使用互斥体数组。互斥数组中的索引对应于计数器数组中的索引。
-
我想过,但是将分配的内存分页到磁盘会导致任何数据损坏。除了一组互斥体之外,还有其他标准方法来处理这种情况吗?
-
如果分页对程序有任何可见的影响而不是性能,这将是一个非常严重的操作系统错误。
-
你应该研究原子。如果您的“计数器”数组用于...计算每个数组元素是计数器的位置,只需将计数器设置为原子整数,您的增加和减少操作就可以有一个宽松的内存顺序。
-
我会将计数器封装在一个类中,并提供访问器方法来获取/设置值,并在类内执行互斥。因此,该课程的用户甚至不必考虑同步。
标签: c++ multithreading locking mutex