Я предоставляю тонкую оболочку для не поточно-ориентированной карты, используя API-интерфейсы AcquireSRWLockShared и AcquireSRWLockExclusive для Windows. По сути, методы, связанные с поиском, принимают блокировку чтения, а методы «set» — блокировку записи — достаточно просто, прямо вперед.
Вот морщинка: я рефакторинг старого кода, и одно из требований заключается в том, что вызывающая сторона должна иметь возможность заблокировать эту карту на «уровне сбора», а затем делать различные вызовы в нее — все «в рамках одной транзакции», чтобы говорить.
Проблема заключается в том, что если я должен был взять блокировку записи и удержать ее, то если бы я должен был выполнить поиск — метод Lookup пытается получить блокировку чтения, которая завершится неудачно или заблокируется. Кажется, я засовываю 2 разных подхода в одну корзину, а этого просто не происходит.
Единственный обходной путь, о котором я могу подумать, это то, что я должен использовать простой критический раздел, который не различает читателей и авторов — и один и тот же поток может входить в один и тот же критический раздел несколько раз. Это было бы отстойно, потому что я действительно хочу получить производительность одного писателя / нескольких читателей. Есть идеи?
Задача ещё не решена.
Других решений пока нет …