有没有一种方法可以同步对已分配内存中每个元素的访问。例如,如果我使用以下代码分配内存
int* counters = new int[10];
有没有一种方法可以分别同步每个计数器的修改(能够同时修改counters [0],counters [1] ... counters [9]),因此,赢得了counters [0]的修改在线程正在更新特定计数器(counters [0])的同时,释放计数器[9]直到锁定被释放以更新counter [9]和其他计数器,才开始吗?这些计数器没有关系,并且不依赖于与其他计数器的任何共享数据吗?
最佳答案
如果要避免使用互斥锁进行同步,则需要研究<atomic>
header 工具。
假设您的“计数器”数组只是跟踪一定数量计数的一种方法,可以使用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>
实例是无锁的。