Как Вы реализуете программное обеспечение Транзакционная Память?

Хорошо с моей точки зрения превосходящий механизм распределения должен использовать что-то как ClickOnce, или технология WebStart . Вы просто развертываете версию на сервере, и это добирается автоматически до клиентов, когда версия выпущена. Также платформа RCP Eclipse содержит UpdateManager, который делает то, что WebStart делают, но также и многое другое.

, Так как я использую Maven2 для создания, развертывание является просто куском пирога: скопируйте созданную банку в местоположение на сервере, обновите jnlp файл в случае необходимости, и Вы сделаны.

22
задан Cody Gray 9 September 2017 в 05:41
поделиться

4 ответа

Самый простой ответ - «это зависит от обстоятельств». Существует множество радикально различных реализаций, работающих практически любым мыслимым образом.

Для меня загадочна та часть, что для некоторого произвольного фрагмента кода вам нужен способ вернуться после этого и определить, действительны ли значения, используемые на каждом шаге. Как это сделать и как сделать это эффективно?

Одно из решений - использовать управление версиями. Каждый раз, когда объект изменяется, его номер версии обновляется. Во время выполнения транзакции вы проверяете версию каждого объекта, к которому был осуществлен доступ, а когда транзакция фиксируется, вы проверяете, что объекты по-прежнему действительны. Эта проверка может быть простым целочисленным сравнением (если transaction_start_version> = object_version , объект действителен), поэтому это можно сделать довольно эффективно.

Это также может означать, что, как и любое другое «блокирующее» решение, вы хотите, чтобы ваши критические секции были как можно меньше (чтобы уменьшить вероятность конфликта), я прав?

Очень вероятно. Я думаю, что некоторые реализации пошли по пути предположения / требования всего как транзакции, но да, в большинстве реализаций транзакции представляют собой специально отмеченные фрагменты кода, и чем дольше выполняется транзакция, тем больше вероятность конфликта, который может привести к откату транзакции.

Кроме того, может ли STM просто обнаружить, что «другой поток вошел в эту область во время выполнения вычисления, следовательно, вычисление недействительно», или он может фактически определить, использовались ли затертые значения (и, таким образом, иногда по удачному стечению обстоятельств два потока могут выполнять одни и те же критические значения). раздел одновременно без необходимости отката)?

Последнее.Имейте в виду, что идея TM заключается в защите данных , а не кода .

Различные пути кода могут обращаться к одной и той же переменной в разных транзакциях. Это должно быть обнаружено системой TM. Нет никакого реального понятия «эта область», поскольку это относится к коду, а не к данным. Системе TM не важно, какой код выполняется, она отслеживает, какие данные изменяются. Этим он полностью отличается от критических разделов (которые защищают код, а не данные)

8
ответ дан 29 November 2019 в 05:00
поделиться

Реализация STM GHC описана в шестом разделе:

Транзакции составной памяти . Тим Харрис, Саймон Марлоу, Саймон Пейтон Джонс, Морис Херлихи. PPoPP'05: Симпозиум ACM SIGPLAN по принципам и практике параллельного программирования, Чикаго, Иллинойс, июнь 2005 г.

И пятый раздел:

Транзакционная память с инвариантами данных . Тим Харрис, Саймон Пейтон-Джонс. Март 2006 г. TRANSACT '06

Саймон Пейтон-Джонс. Март 2006 г. TRANSACT '06

Саймон Пейтон-Джонс. Март 2006 г. TRANSACT '06

6
ответ дан 29 November 2019 в 05:00
поделиться

Если вы собираетесь использовать .NET framework,

вы можете проверить этот экспериментальный

2
ответ дан 29 November 2019 в 05:00
поделиться

Предлагаю вам посмотреть эту презентацию: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

Во второй половине объясняется как обновить значения, не оставляя их в неопределенном состоянии. Например, если у вас есть дерево, которое вы хотите обновить в стиле STM, вы вообще не меняете предыдущую версию. Допустим, tree является указателем на корень дерева. Единственное, что вы создаете, - это узлы, которые изменились (но они могут ссылаться на узлы в исходном снимке дерева.

Затем вы выполняете сравнение и замену на указателе tree . Если он успешно, то теперь все будут видеть ваше новое дерево, а старое может быть собрано с помощью сборщика мусора. Если этого не произошло, вы повторяете процесс, и только что построенное дерево будет собрано сборщиком мусора.

4
ответ дан 29 November 2019 в 05:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: