【发布时间】:2012-02-19 00:36:57
【问题描述】:
Win32 Mutex 是限制线程访问哈希表中链表的最有效方法吗?我不想创建很多句柄,并且哈希表的大小是可变的。它可能是数千个。当只有一个条目的列表被更改时,我不想锁定整个列表,所以这将需要多个互斥锁(每个列表一个),但我想我可能会通过汇集大约 20 个互斥锁句柄并重用来侥幸他们,因为不应该有那么多线程同时访问它。对于这种情况,是否有互斥锁的替代品?
【问题讨论】:
-
如果线程都在同一个进程中,我会使用临界区而不是互斥体
-
那么在 Win32 中调用 InitializeCriticalSection()、EnterCriticalSection()、LeaveCriticalSection() API 吗?
-
是的,操作比互斥锁简单得多,但只能在单个进程中工作
-
关键部分+1。另外,评论原曲;我对池化方法很好奇:似乎这需要跟踪池中的每个锁与哪个列表(如果有)相关联,需要另一个数据结构,然后它本身就需要一个锁...... :)跨度>
-
但是拥有一个包含 1033 个或更多条目且每个条目都带有锁的哈希表总共需要 24792 个字节(每个 CRITICAL_SECTION 结构 24 个字节)。这就是为什么我可以创建一个包含大约 20 个节点(20 x 24 = 480 字节)的池(带有单个锁)。我猜这是内存与速度的权衡。不应该有那么多线程在运行,所以我认为即使池有锁,它也不会受到太大影响。