После нескольких месяцев оценки и переоценки и планирования различных структур данных и веб-серверов/приложений я сейчас нахожусь в точке, где мне нужно ударить головой по деталям. Вопрос (в настоящий момент теоретический), с которым я столкнулся, таков:Как предотвратить состояние гонки при удалении хранимой структуры GWAN KV?
Скажем, я использую хранилища GWANs KV для хранения C-структур для пользователей и т.п. (отлично работает, проверено), как мне следует удалить эти объекты из KV, а затем из памяти, не сталкиваясь с состоянием гонки?
Это то, что я нахожусь в данный момент:
Тема A:
- захватить другие объекты, ссылающихся на один, чтобы быть удален
- набор ссылок на NULL
- удаления объекта
Резьба B:
- попытаться получить объект -> kv может вернуть объект, так как он еще не удален
- попытаться что-то сделать с объектом -> уже можно удалить здесь, чтобы я мог получить доступ к уже освобожденной памяти?
или что-то другое, что может случиться:
Темы B:
- прибудет вещь ссылки объект
- последующей ссылка -> объект может не быть удален здесь
- сделать что-то со ссылкой -> объект может быть удален здесь -> проблема
или
Темы B:
- получили какой-то другой объект, который может ссылаться на который нужно удалить объект
- захватить объект, который еще не удален
- набор ссылки на объект -> объект может быть удалены здесь -> проблема
Есть ли способ избежать таких условий, за исключением использования замков? Я нашел широту документов, описывающих алгоритмы, касающиеся разных ситуаций с производителем/потребителем, hashtables, ... даже иногда ждут свободных реализаций (я еще не нашел хороший пример, чтобы показать мне разницу между блокировкой и ожиданием без, хотя я понимаю это концептуально), но я не мог понять, как бороться с такими вещами.
Могу ли я переусердствовать в этом, или может быть, простой способ избежать всех этих ситуаций? Я могу свободно изменять структуру данных и ресурсов, я хочу, и я могу свободно использовать инструкции для процессора (например,CAS)
Заранее спасибо
Спасибо! Так что, если я правильно понимаю, можно было бы использовать пул памяти G-WAN для пары ключ-значение KV (есть ли какие-нибудь примеры для рассмотрения этой комбинации?), Поэтому он автоматически освобождается, когда все обращения к запросам заканчиваются, и все, что мне нужно сделать, это удалить KV, и если какой-либо другой поток получит доступ к структуре после этого, это будет хорошо, поскольку пул памяти будет освобожден только после завершения доступа к потокам? – griffin
Редактирование: удалено, поскольку то, что я написал, даже не имеет смысла само по себе;) – griffin
После того, как я ударил головой об этом, я понял, что то, что вы написали, на самом деле отлично отвечает на часть моего вопроса, а остальное - это то, что я должен решайте алгоритмически (убедитесь, что освобожденный материал больше не ссылается). Благодаря! – griffin