哈希表条目链表 - 用于线程安全操作的互斥锁

时间:2012-02-19 00:36:58

标签: winapi list hash mutex

Win32 Mutex是否是限制散列表中链接列表的线程访问的最有效方法?我不想创建很多句柄,并且哈希表的大小是可变的。它可能有数千人。当只有一个条目的列表被更改时,我不想锁定整个列表,因此会调用多个互斥锁(每个列表一个),但我想我可以通过汇集大约20个Mutex句柄并重用因为不应该有那么多线程同时访问它们。在这种情况下,是否有替代Mutex锁?

2 个答案:

答案 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锁很可能足够快。