2013-04-30 31 views
31

Głównym powodem używania atomów przez muteksy jest to, że muteksy są drogie, ale z domyślnym modelem pamięci dla atomics będącym memory_order_seq_cst, czy to nie jest tak drogie?Czy synchronizacja z `std :: mutex` jest wolniejsza niż z` std :: atomic (memory_order_seq_cst) `?

Pytanie: Czy jednoczesny program korzystający z blokad może działać tak szybko, jak współbieżny program blokujący?

Jeśli tak, może nie być warta wysiłku, chyba że chcę użyć atomu w postaci memory_order_acq_rel.


Edit: I może być czegoś brakuje, ale nie może być oparte blokady szybciej niż wolne blokady zamka, ponieważ każdy będzie musiał mieć pełną bariera pamięci też. Ale z blokadą można używać technik mniej restrykcyjnych niż barier pamięci.

Wracając do mojego pytania, czy blokowanie jest szybsze niż blokowanie oparte na nowym standardzie C++ 11 z domyślnym memory_model?

Czy "blokuje się" = blokuje się, gdy mierzona jest wydajność "prawda? Załóżmy 2 wątki sprzętowe.


Edit 2: Moje pytanie nie jest o gwarancji postępy i może używam "lock-free" wyrwane z kontekstu.

Zasadniczo, gdy masz 2 wątki z pamięcią wspólną i jedyną gwarancją, której potrzebujesz, jest to, że jeśli jeden wątek pisze, a drugi wątek nie może odczytać ani zapisać, moje założenie jest takie, że prosta operacja atomowa compare_and_swap byłaby znacznie szybciej niż blokowanie muteksa.

Ponieważ jeśli jeden wątek nigdy nie dotknie pamięci współdzielonej, w kółko skończy się blokowanie i odblokowywanie, ale przy operacjach atomowych używasz tylko jednego cyklu procesora za każdym razem.

W odniesieniu do komentarzy, spin-lock vs mutex-lock jest bardzo różny, gdy istnieje bardzo mały spór.

+0

Cóż, istnieją różne gwarancje postępu między blokadami, blokadą i kodem bezczynności. –

+8

[Obowiązkowe czytanie] (http://www.1024cores.net/home/lock-free-algorithms). –

+1

Oglądaj: https://www.youtube.com/watch?v=DCdGlxBbKU4 – NoSenseEtAl

Odpowiedz

53

programowanie Lockfree jest o postęp gwarantuje: Od najsilniejszy do najsłabszych, to są czekać wolne, lock-wolny, wolne od przeszkód i blokowania.

Gwarancja jest droga i ma swoją cenę. Im więcej gwarancji chcesz, tym więcej płacisz. Ogólnie rzecz biorąc, algorytm blokujący lub struktura danych (z mutex, powiedzmy) ma największą swobodę, a zatem jest potencjalnie najszybsza. Algorytm bezczynności na drugiej skrajności musi używać operacji atomowych na każdym kroku, który może być znacznie wolniejszy.

Uzyskanie blokady jest w rzeczywistości tanie, więc nie należy się tym martwić bez głębokiego zrozumienia tematu. Co więcej, algorytmy blokujące z muteksami są znacznie łatwiejsze w czytaniu, pisaniu i rozumowaniu niż . Z kolei nawet najprostsze struktury danych bez blokowania są wynikiem długich, ukierunkowanych badań, z których każdy wart jest jednego lub więcej doktoratów.

W skrócie, algorytmy blokujące lub zwalniające handlują najgorszą latencją dla przeciętnego opóźnienia i przepustowości. Wszystko jest wolniejsze, ale nic nie jest nigdy wolne.Jest to bardzo szczególna cecha, która jest przydatna tylko w bardzo szczególnych sytuacjach (takich jak systemy czasu rzeczywistego).

+0

ok - ale 2 wątki z udostępnionymi danymi .. nie zgadzasz się, że spin-lock jest szybszy niż blokada blokująca? – jaybny

+0

na przykład aplikacja handlowa, która słucha tyknięć z 2 giełd na 2 wątkach. czy spin-lock nie byłby dużo szybszy niż mutex? – jaybny

+4

@jaybny: Nie, dlaczego. A spinlock to także zamek. Nie zmienia podstawowych gwarancji. I proszę przyjrzeć się implementacji pthread mutex dla miłej niespodzianki. –

2

Zamek wymaga zazwyczaj więcej operacji, niż robi to prosta operacja atomowa. W najprostszych przypadkach memory_order_seq_cst będzie około dwa razy szybszy od blokowania, ponieważ blokowanie zwykle wymaga, przy minimum dwóch operacjach atomowych w jego implementacji (jeden do zablokowania, jeden do odblokowania). W wielu przypadkach zajmuje to nawet więcej. Jednak po rozpoczęciu korzystania z zamówień pamięci, może być znacznie szybciej, ponieważ jesteś gotów zaakceptować mniej synchronizacji.

Ponadto często można zauważyć, że "algorytmy blokowania są zawsze tak szybkie, jak algorytmy bez blokady". To jest trochę prawdziwe. Podstawową ideą jest to, że jeśli najszybszy algorytm jest pozbawiony blokady, to najszybszy algorytm bez bez blokady jest taki sam jak algorytm! Jednakże, jeśli najszybszy algortihm wymaga blokad, to te wymagające gwarancji bez blokady muszą znaleźć wolniejszy algorytm.

Ogólnie rzecz biorąc, zobaczysz algorytmy bez blokady w kilku algorytmach niskiego poziomu, w których pomaga wykorzystanie specjalistycznych kodów opcyjnych. W prawie wszystkich innych kodach blokowanie to więcej niż zadowalająca wydajność i znacznie łatwiejsze do odczytania.

+0

"Algorytmy blokowania są zawsze tak szybkie, jak algorytmy bez blokady." - Po prostu tego nie rozumiem. pętla bezpieczna dla wątków z pamięcią współużytkowaną będzie znacznie szybsza, dzięki prostej operacji porównywania, a następnie odblokowaniu blokady (muteks) (muteks). zwłaszcza, jeśli nie ma rywalizacji z innego wątku. – jaybny