Win32 Mutex是否是限制散列表中链接列表的线程访问的最有效方法?我不想创建很多句柄,并且哈希表的大小是可变的。它可能有数千人。当只有一个条目的列表被更改时,我不想锁定整个列表,因此会调用多个互斥锁(每个列表一个),但我想我可以通过汇集大约20个Mutex句柄并重用因为不应该有那么多线程同时访问它们。在这种情况下,是否有替代Mutex锁?
答案 0 :(得分:0)
这里有很多依赖于哈希表的细节。我的立即反应是完全避免使用互斥/关键部分,至少如果可以的话。
至少在向链表添加项目时,使用InterlockedExchangePointer
可以很容易地避免它。大概你有一个类似的结构:
struct LL_item {
LL_item *next;
std::string key;
whatever_type value;
};
要将此类型的项目插入到链接列表中,请执行以下操作:
LL_item *item = new LL_item;
// set key and value here
item->next = &item;
InterlockedExchangePointer(&item->next, &bucket->head);
在InterlockedExchangePointer
之前,bucket->head
包含当前列表中第一个项目的地址。我们用next
指针中的自己的地址初始化我们的新项目。然后,我们(原子地)将新项目中的下一个指针与指向列表中(先前)第一个节点的指针交换。在交换之后,新节点的下一个指针包含列表中先前第一项的地址,而指向列表头部的指针包含新节点的地址。
我相信你可以(可能)通常使用交换来从列表中删除项目,但我不确定 - 我没有仔细考虑过。相当多的哈希表都没有(甚至尝试)支持删除,所以你可能不关心这一点。
答案 1 :(得分:0)
我建议slim reader writer lock。当然,它会在您进行更新时锁定整个数据结构,但通常您会比写入哈希表的内容多得多。我对SRW锁的经验是它运行良好,性能非常好。你可能应该尝试一下。那会让你的程序运转起来。然后,您可以分析代码以确定是否存在瓶颈,如果存在瓶颈,则确定是否存在瓶颈。 SRW锁很可能足够快。