是否有办法同步对已分配内存中每个元素的访问。例如,如果我使用以下代码分配内存
int* counters = new int[10];
有没有办法分别同步每个计数器的修改(能够同时修改计数器[0],计数器[1] ...计数器[9]),以便修改,比如计数器[ 0]不会阻止计数器[9]直到锁定被释放以更新计数器[9]而其他计数器在线程更新特定计数器时,计数器[0]?计数器不相关,不依赖于与其他计数器的任何共享数据?
答案 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>
实例是无锁的。