同步对已分配内存的访问

synchronizing access to allocated memory

本文关键字:访问 内存 分配 同步      更新时间:2023-10-16

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

分配内存
int* counters = new int[10];

是否有办法分别同步修改每个计数器(能够修改计数器[0],计数器[1]…计数器[9]的修改,比如,计数器[0]不会阻塞计数器[9],直到锁被释放,更新计数器[9]和其他计数器,而线程正在更新一个特定的计数器,计数器[0]?计数器不相关,也不依赖于与其他计数器共享的数据。

如果您想避免使用互斥体进行同步,则需要查看<atomic>头设施。

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

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

虽然互斥数组是一种自然的解决方案,但应该考虑其含义。这对于包含10个元素的数组来说很好,但是互斥锁的数量实际上是有限的。如果您有一个包含50,000个元素的数组(根本不是那么大),您将耗尽互斥锁。