W poprzednim poście przedstawiłem Wam kilka istniejących implementacji STM, a dzisiaj chciałbym dopełnić tę listę o kilka równie ważnych rozwiązań.
NSTM [2] to .NETowe rozwiązanie Ralfa Sudelbuchera, który na swoim blogu w kilku wpisach [1] wyjaśnia dokładnie, w jaki sposób z niego korzystać. Tak jak poprzednio opisywane rozwiązania, NSTM opakowuje obiekty, ale w inny sposób, niż robi to np. SXM – opakowując wskazane metody i właściwości obiektu. NSTM trzyma wewnątrz fasady obiekt danej klasy, może go nam zwrócić (zapisze to wtedy w logu) i wtedy mamy możliwość jego modyfikacji, ale nastepnie należy go znów w całości zapisać. Przykład ze strony Ralfa:
-
INstmObject<double> myAccount;
-
INstmObject<double> yourAccount;
-
-
myAccount = NstmMemory.CreateObject(1000);
-
yourAccount = NstmMemory.CreateObject(500);
-
-
using (INstmTransaction tx = NstmMemory.BeginTransaction())
-
{
-
double amountToTransfer = 150;
-
myAccount.Write(myAccount.Read() – amountToTransfer);
-
yourAccount.Write(yourAccount.Read() + amountToTransfer);
-
tx.Commit();
-
}
Kolejnym rozwiązaniem autorstwa trochę większego producenta niż jednoosobowy zespół Ralfa jest Intel® C++ STM Compiler, Prototype Edition 3.0 [3].
Na początek zachęcam do obejrzenia Flashowej prezentacji omawiającej problem transakcji. Choć wszystkie napisy w owej prezentacji brzmią „undefined„, to animacja przedstawiona na rysunku obok doskonale tłumaczy zasady STM. Wracając jednak do samego rozwiązania. Środowisko to oczywiście C++. Odpowiednie metody klas (te, których chcemy używać w transakcji) należy opatrzyć atrybutem __declspec(tm_callable), samą transakcję deklarujemy przy pomocy bloku __declspec(tm_callable). Przykład ze strony producenta, w powiązaniu z OpenMP:
-
include<stdio.h>
-
-
int xx = 0;
-
-
class Base {
-
public:
-
__declspec(tm_callable)
-
virtual void TxnAddOne() {
-
xx = xx + 1;
-
}
-
};
-
-
class Virtual : public Base {
-
public:
-
__declspec(tm_callable)
-
void TxnAddOne() {
-
xx = xx + 1;
-
}
-
};
-
-
int main() {
-
Base *x, *y;
-
-
__tm_atomic {
-
x = new Base();
-
x->TxnAddOne();
-
}
-
-
__tm_atomic {
-
y = new Virtual();
-
y->TxnAddOne();
-
}
-
}
[Pobierz cały kod ze strony Intela]
Na rozwiązaniu Intela chciałbym zakończyć przedstawianie implementacji STM. Większość tych, które nie zostały omówione, nie była uaktualniana od kilku lat, a jak wiemy, w branży IT 2-3 lata to przepaść.
Był to ostatni wpis na temat Pamięci Transakcyjnej. W następnych postach z cyklu „Go Parallel, be Master” postaram się opisać kolejny sposób na tworzenie aplikacji równoległych, jednak tym razem z wykorzystaniem agentów oraz wiadomości. Zapraszam.
Źródła:

Pingback: Pamięć Transakcyjna – Istniejące implementacje – cz.2 - develway.pl