Ponieważ byłem trochę zdezorientowany, zacznę od wyjaśnienia kilku pojęć w pytaniu.
Kolekcja . Nie widzę powodu, by poświęcać czas na rygorystyczne definiowanie, co oznacza „zbieranie”, kiedy możemy po prostu zapytać, co się dzieje z ogólnymi strukturami danych. Struktura danych zajmuje część pamięci i ma pewne operacje, które mogą uzyskać dostęp do tej pamięci i które mogą być wywoływane przez użytkowników . Ci użytkownicy mogą być odrębnymi procesorami lub po prostu różnymi wątkami, nie dotyczy nas to. Liczy się tylko to, że mogą wykonywać operacje równolegle.
Bez blokady . Herlihy i Boss twierdzą, że struktura danych jest wolna od blokowania, gdy awaria użytkownika nie uniemożliwia dalszego korzystania ze struktury danych. Na przykład wyobraź sobie, że nalewa się wodę do procesora, który właśnie wstawia węzeł do posortowanego zestawu. Cóż, jeśli inne procesory spróbują później wstawić do tego posortowanego zestawu, powinny odnieść sukces. ( Edycja: Zgodnie z tą definicją, to jest tak, że jeśli używa struktury danych zamki to nie jest lock-wolny, ale to nie jest tak, że jeśli struktura danych nie używa blokad to jest lock-wolny).
Mając te definicje, myślę, że Herlihy i Boss zasadniczo twierdzą, że odpowiedzią jest przekształcenie kluczowych regionów w transakcje.
Ale możesz zapytać, czy to ma taką samą złożoność? Nie jestem pewien, czy pytanie ma sens. Zastanów się push(x) { lock(); stack[size++] = x; unlock(); }
. Czy to operacja o stałym czasie? Jeśli zignorujesz operację blokowania, a tym samym innych użytkowników, możesz odpowiedzieć TAK. Jeśli nie chcesz ignorować innych użytkowników, naprawdę nie ma sposobu, aby powiedzieć, czy wypychanie będzie działać w stałym czasie. Jeśli przejdziesz o jeden poziom wyżej i zobaczysz, w jaki sposób stos jest wykorzystywany przez określony algorytm, możesz powiedzieć, że wypychanie zawsze zajmie stały czas (mierzony teraz w zależności od tego, co stanie się wejściem równoległego algorytmu). Ale to naprawdę jest właściwość twojego algorytmu, więc nie ma sensu mówić, że push jest operacją o stałym czasie.
Podsumowując, jeśli zignorujesz, ile użytkownik wykonujący operację czeka na innych użytkowników, wówczas użycie transakcji zamiast regionów krytycznych odpowiada twierdząco. Jeśli nie zignorujesz czasu oczekiwania, musisz spojrzeć na to, jak używana jest struktura danych.