同步对已分配内存的访问
synchronizing access to allocated memory
是否有同步访问已分配内存中每个元素的方法?例如,如果我使用以下代码
分配内存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个元素的数组(根本不是那么大),您将耗尽互斥锁。
相关文章:
- 特里树.无法访问内存
- 如何使用 C/C++ 访问内存的内容?
- 指针可以用于访问内存中的任何任意区域吗?
- 分段错误:无法访问内存
- SIGABRT 在线程中访问内存时
- 访问内存以内联循环访问数组
- 如何从C或C 语言级别安全访问内存映射的硬件寄存器
- 在释放了所有作用域内指针之后仍然可访问内存
- 有什么快速访问内存的技巧吗
- CUDA非法访问内存
- C++ 访问内存冲突
- 悬空指针仍在访问内存值
- 当我尝试从结构列表中访问内存时出现错误:" Program received signal SIGSEGV, Segmentation fault."
- 如何访问内存映射的 USB 主控制器寄存器
- 访问内存时出现奇怪的崩溃
- 如何在C++读取块后访问内存中的文件数据
- 使用共享库时仍可访问内存
- 从 C++ 结构中包含的指针数组动态分配和访问内存
- Win32应用程序,可无限制地访问内存
- 强制两个线程直接访问内存中的全局变量