Jak zbudować kolejkę bez blokady?

Spędziłem dzisiaj patrząc w kolejki bez zamków. Mam wielu producentów, wiele sytuacji konsumenckich. Zaimplementowałem, do testowania, system korzystający z elementu Interlocked SList pod Win32 i podwoił wydajność mojego silnie wątkowego kodu opartego na zadaniach. Niestety, chciałbym obsługiwać wiele platform. Blokowanie na wielu platformach samo w sobie nie stanowi problemu i mogę spokojnie założyć, że mogę się bez problemów blokować. Jednak rzeczywista realizacja mnie traci.

Dużym problemem wydaje się być to, że musisz zagwarantować, że lista push / pop użyje tylko jednego połączenia zablokowanego. W przeciwnym razie zostawiasz miejsce na inny wątek, który może się wciągnąć i zepsuć. Nie jestem pewien, jak wdrożenie microsoft działa pod maską i chciałbym wiedzieć więcej.

Czy ktoś może wskazać mi przydatne informacje (platforma i język są nieistotne)?

Dodałem do tego, że chciałbym wiedzieć, czy możliwe jest zaimplementowanie bezszyfrowanego wektora. To miałoby dla mnie ogromne zużycie :) Pozdrawiam!

Edycja: Po przeczytaniu artykułu DDJ z herbu widzę zmniejszoną kolejkę blokady, która jest bardzo podobna do tej, którą już miałem. Zauważam jednak, że na końcu są dokumenty, które potrafią wykonać prawdziwą kolejkę bez blokady przy użyciu operacji podwójnego porównania i wymiany (DCAS). Czy ktoś zaimplementował kolejkę za pomocą cmpxchg8b (lub cmpxchg16b)?

Po prostu zastanawiam się w tym momencie (nie czytając gazet), ale można użyć tego systemu do jednoczesnego zaktualizowania wskaźnika głowy i ogona, a tym samym uniknięcia jakichkolwiek problemów z kolejnym wątkiem przeskakującym pomiędzy 2 operacjami atomowymi. Jednak nadal musisz zdobyć następny wskaźnik głowy, aby przetestować go na wskaźniku ogona, aby sprawdzić, czy zmodyfikowałeś ogon. Jak uniknąć innego wątku zmieniającego te informacje, podczas gdy drugi wątek przygotowuje się do tego samego? Jak dokładnie jest to realizowane w sposób bez blokady? A może lepiej czytać niezdarność, która jest dokumentem badawczym? ;)

questionAnswers(5)

yourAnswerToTheQuestion