является концепцией использования транзакций, а не замков для синхронизации процессов, которые выполняются параллельно и совместно использовать память.
На очень упрощенном уровне для синхронизации с замками вы определяете разделы кода (так называемые критические разделы), которые не должны выполняться одновременно разными потоками и захватывать и отпускать блокировки вокруг критических секций. Поскольку каждый замок может удерживаться только одним потоком за раз, это гарантирует, что, как только один поток войдет в критический раздел, все операции раздела будут завершены до того, как другой поток войдет в критический раздел, защищенный одной и той же блокировкой.
Транзакционная память вместо этого позволяет назначать разделы кода как транзакции. Система транзакционной памяти (которая может быть реализована в аппаратном, программном обеспечении или и том и другом), затем пытается дать вам гарантию, что любой запуск программы, в которой несколько потоков выполнят параллельные транзакции, будет эквивалентен другому запуску программы, в которой все транзакции выполнялись один за другим, никогда в одно и то же время.
Система транзакционной памяти делает это, позволяя транзакциям выполнять параллельно и контролировать их доступ к транзакционным переменным. Если система обнаруживает конфликт между доступом двух транзакций к одной и той же переменной, это приведет к тому, что один из них прервет и «откат» к началу транзакции, в которой он был запущен; он автоматически перезапустит транзакцию, и общее состояние системы будет таким, как если бы он никогда не запускал предыдущий запуск.
Целью транзакционной памяти является простота программирования и безопасности; правильно внедренная система ТМ, способная обеспечить соблюдение того, что транзакции используются правильно, дает жесткие гарантии, что в программе нет ошибок параллелизма (взаимоблокировок, условий гонки и т. д.), и требуется только, чтобы программист определял транзакции (а иногда переменные транзакции, если система не просто считает всю память неявно переменной транзакции), без необходимости точно определять, какие блокировки необходимы, получить их в правильном порядке, чтобы предотвратить тупик и т. д. и т. д.«Трансацитоны используются правильно» подразумевает отсутствие обмена данными между потоками без прохождения переменных транзакции, отсутствие доступа к транзакционным данным, кроме транзакций, и никаких «отказоустойчивых» операций внутри транзакций); библиотечные программные системы транзакционной памяти для императивных языков, таких как C, Java и т. д., как правило, не могут обеспечить выполнение всего этого, что может воссоздать возможность некоторых ошибок параллелизма.
Другой целью транзакционной памяти является увеличение параллелизма; если у вас есть целая куча параллельных операций, которые обращаются к некоторой структуре данных, все из которых могут записать в нее, но некоторые из них фактически выполняются, тогда синхронизация на основе блокировки обычно требует, чтобы все операции выполнялись последовательно, чтобы избежать возможности повреждение данных. Транзакционная память позволит почти всем операциям работать параллельно, только теряя параллелизм, когда какой-то процесс фактически делает, напишите в структуре данных.
На практике (с того момента, как несколько лет назад я исследовал проект своих почестей), транзакционная память аппаратного обеспечения на самом деле не была снята, а текущие программные системы оперативной памяти имеют значительные накладные расходы. Таким образом, транзакционная память программного обеспечения больше ориентирована на «разумную производительность, которая масштабируется с доступными процессорами умеренно хорошо и довольно легко кодируется», а не дает вам абсолютную максимальную производительность.
Однако существует много различий между различными системами транзакционной памяти; Я говорю на довольно абстрактном и упрощенном уровне.
Я думаю, что вы перепродажа здесь. ТМ-алгоритмы тонкие, так же, как традиционные методы синхронизации. И полученные ошибки могут быть одинаково непостижимыми. В любом случае вам вообще нужен рабочий традиционный вариант в любом случае в качестве резерва для транзакционных столкновений, поэтому бесплатного обеда нет. По этим причинам STM в значительной степени не удалось поймать. HTM в Haswell выглядит многообещающим, но более того, с точки зрения производительности, чем простота программирования. –
** Если ** система STM направлена на обеспечение надежных гарантий безопасности ** и ** существует механизм для обеспечения того, чтобы (a) доступ к транзакционным данным осуществлялся только из транзакций (b) транзакции никогда не имели побочных эффектов, тогда Гарантируется, что программы STM будут свободны от условий гонки и тупиков. Это работало над реализацией STM. Плохое использование такой STM-системы может дать вам ужасную производительность из-за конкуренции, но она не может дать вам взаимоблокировки или условия гонки, которые могут вызывать проблемы только в чрезвычайно точных условиях синхронизации. – Ben
Эти предпосылки не соответствуют реалиям STM, основанным на библиотеке для C, хотя, поскольку без языковой интеграции нет возможности обеспечить соблюдение (a) и (b), а с C в любом случае довольно сложно что-либо принудить. Я не знаю столько о HTM, но я понимаю, что вы снова нуждаетесь в языковой интеграции для обеспечения гарантий безопасности, поэтому использование HTM с C или ассемблера не идет с бесплатным обедом, нет. – Ben