作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
假设我们有一个大数组和许多线程对该数组中的具体索引进行操作。两个线程不能同时对一个索引进行操作,一个应该等到另一个完成。还有一个蹩脚的问题:如何在 Linux/C/C++ 中对数组的每个索引实现 test-and-set
锁定?
最佳答案
对于细粒度锁定,使用一组读/写锁(正如 Carey Hickling 建议的那样)。散列索引值并通过位掩码(或使用模数)对其进行过滤以选择要使用的锁。
这有效地将索引拆分为 N 个存储桶,其中 N 是您创建的锁的数量。为锁定数选择 2 的幂,以便轻松进行位掩码(掩码 = N - 1)。这种情况下的唯一缺点是您不仅锁定了特定的索引,而且锁定了每个索引,这些索引在散列时与同一个锁指针对齐。
也就是说,您创建的锁越多,锁定的粒度就越细(16 可能是一个很好的起点)。读取锁也与 rw_locks 共享,因此您只需担心在写入期间等待锁。
关于c++ - 细粒度锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9026718/
在命令提示符下,当你按下插入按钮时,光标从细条变为粗条,表明它处于覆盖模式,当你再次按下它时,它又变细表明它处于插入模式有什么办法可以在 C# 中执行此操作吗? 编辑:我想知道是否有办法使光标变粗/变
RubyRogues 播客上有人曾经说过“学习 CoffeeScript,因为 CoffeeScript 编写的 javascript 比你更好。”抱歉,不记得是谁说的... 所以,我采用了一个非常简
我是一名优秀的程序员,十分优秀!