2013-07-03 2 views
0

После нескольких месяцев оценки и переоценки и планирования различных структур данных и веб-серверов/приложений я сейчас нахожусь в точке, где мне нужно ударить головой по деталям. Вопрос (в настоящий момент теоретический), с которым я столкнулся, таков:Как предотвратить состояние гонки при удалении хранимой структуры GWAN KV?

Скажем, я использую хранилища GWANs KV для хранения C-структур для пользователей и т.п. (отлично работает, проверено), как мне следует удалить эти объекты из KV, а затем из памяти, не сталкиваясь с состоянием гонки?

Это то, что я нахожусь в данный момент:

Тема A:

  • захватить другие объекты, ссылающихся на один, чтобы быть удален
  • набор ссылок на NULL
  • удаления объекта

Резьба B:

  • попытаться получить объект -> kv может вернуть объект, так как он еще не удален
  • попытаться что-то сделать с объектом -> уже можно удалить здесь, чтобы я мог получить доступ к уже освобожденной памяти?

или что-то другое, что может случиться:

Темы B:

  • прибудет вещь ссылки объект
  • последующей ссылка -> объект может не быть удален здесь
  • сделать что-то со ссылкой -> объект может быть удален здесь -> проблема

или

Темы B:

  • получили какой-то другой объект, который может ссылаться на который нужно удалить объект
  • захватить объект, который еще не удален
  • набор ссылки на объект -> объект может быть удалены здесь -> проблема

Есть ли способ избежать таких условий, за исключением использования замков? Я нашел широту документов, описывающих алгоритмы, касающиеся разных ситуаций с производителем/потребителем, hashtables, ... даже иногда ждут свободных реализаций (я еще не нашел хороший пример, чтобы показать мне разницу между блокировкой и ожиданием без, хотя я понимаю это концептуально), но я не мог понять, как бороться с такими вещами.

Могу ли я переусердствовать в этом, или может быть, простой способ избежать всех этих ситуаций? Я могу свободно изменять структуру данных и ресурсов, я хочу, и я могу свободно использовать инструкции для процессора (например,CAS)

Заранее спасибо

ответ

0

Несколько вопросов там:

УДАЛЕНИЕ Гван KV сохраненную-структуру

При удалении KV от указателя инерционности или освобождая КВ, у вас есть чтобы никто не разыменовал освобожденные данные.

Это зависит от приложения. Вы можете ввести некоторый допуск, используя пулы памяти G-WAN, которые заставят данные выдержать удаление KV, пока память не будет перезаписана (или пул освобожден).

удаление пару Гван КВ ключ-значение

Гван в КВ магазин делает бухгалтерский учет (с использованием атомных встроенных функций), чтобы защитить значения, получаемые нитей и их снятие защиты после того, как запрос был обработан.

Если вам нужно сохранить данные в течение более длительного времени, сделайте копию.

Другие инструменты для хранения данных, такие как блокировки SQLite в памяти. В этом случае очень важна гранулярность блокировки.

+0

Спасибо! Так что, если я правильно понимаю, можно было бы использовать пул памяти G-WAN для пары ключ-значение KV (есть ли какие-нибудь примеры для рассмотрения этой комбинации?), Поэтому он автоматически освобождается, когда все обращения к запросам заканчиваются, и все, что мне нужно сделать, это удалить KV, и если какой-либо другой поток получит доступ к структуре после этого, это будет хорошо, поскольку пул памяти будет освобожден только после завершения доступа к потокам? – griffin

+0

Редактирование: удалено, поскольку то, что я написал, даже не имеет смысла само по себе;) – griffin

+0

После того, как я ударил головой об этом, я понял, что то, что вы написали, на самом деле отлично отвечает на часть моего вопроса, а остальное - это то, что я должен решайте алгоритмически (убедитесь, что освобожденный материал больше не ссылается). Благодаря! – griffin

Смежные вопросы