同步对已分配内存的访问

时间:2015-09-10 19:33:43

标签: c++ multithreading locking mutex

是否有办法同步对已分配内存中每个元素的访问。例如,如果我使用以下代码分配内存

int* counters = new int[10];

有没有办法分别同步每个计数器的修改(能够同时修改计数器[0],计数器[1] ...计数器[9]),以便修改,比如计数器[ 0]不会阻止计数器[9]直到锁定被释放以更新计数器[9]而其他计数器在线程更新特定计数器时,计数器[0]?计数器不相关,不依赖于与其他计数器的任何共享数据?

1 个答案:

答案 0 :(得分:2)

如果要避免使用互斥锁进行同步,则需要查看<atomic>标头工具。

假设你的&#39;计数器&#39;数组只是一种跟踪一定数量计数的方法,可以使用std::atomic<int> counters[10]来完成,并且每个计数器都可以通过调用counters[i].fetch_add(1, std::memory_order_relaxed)以线程安全的方式递增。

正如Barmar用户指出的那样,std::atomic<int>也可以在内部使用互斥锁。这取决于实现,可以通过调用is_lock_free()实例的std::atomic<int>成员函数来查询。在我的实现中,std::atomic<int>实例是无锁的。