Здесь многое зависит от деталей вашей хеш-таблицы.Моя немедленная реакция заключается в том, чтобы вообще избежать мьютекса / критической секции, по крайней мере, если вы можете.
По крайней мере, для добавления элемента в связанный список, довольно легко избежать его, используя 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
.Затем мы (атомарно) обмениваем следующий указатель в нашем новом элементе с указателем на указатель на (предыдущий) первый узел в списке.После обмена следующий указатель нового узла содержит адрес ранее первого элемента в списке, а указатель на начало списка содержит адрес нашего нового узла.
Я полагаю, что вы можете (вероятно) обычно используют обмен для удаления элемента из списка, но я не уверен - я не продумал это так тщательно.Довольно много хеш-таблиц не поддерживают (даже не пытаются) в любом случае, поэтому вам может быть все равно.