Oto jak napisać lock- wolna kolejka w C++:
http://www.ddj.com/hpc-high-performance-computing/210604448
Ale gdy powiesz „nawlec nie musi blokować”, jesteś pewna, że to wymaganie? Windows nie jest systemem operacyjnym czasu rzeczywistego (i nie jest linuxem, w normalnym użyciu). Jeśli chcesz, aby wątek A mógł korzystać z całej dostępnej pamięci systemowej, musisz przydzielić pamięć (lub poczekać, aż zrobi to inna osoba). Sam system operacyjny nie może zapewnić gwarancji czasowych lepszych niż te, które miałbyś, gdyby zarówno czytnik, jak i program piszący, wykonali blokadę procesu (tj. Nie-udostępniony muteks) w celu manipulowania listą. A najgorszy przypadek dodania wiadomości będzie musiał przejść do systemu operacyjnego, aby uzyskać pamięć.
Podsumowując, istnieje powód, dla którego te kolejki, które nie lubisz, mają stałą pojemność - tak, że nie muszą przydzielać pamięci w wątku o rzekomo niskim opóźnieniu.
Tak więc kod bez blokady generalnie będzie mniejszy blok-y, ale ze względu na przydzielenie pamięci nie ma gwarancji, że jest, a wydajność z muteksem nie powinna być tak nędzna, chyba że masz naprawdę olbrzymie strumień zdarzeń do przetworzenia (np. piszemy sterownik sieciowy, a wiadomości są przychodzącymi pakietami ethernetowymi).
Więc w pseudo-kodzie, pierwszą rzeczą, którą staram byłoby:
Writer:
allocate message and fill it in
acquire lock
append node to intrusive list
signal condition variable
release lock
Reader:
for(;;)
acquire lock
for(;;)
if there's a node
remove it
break
else
wait on condition variable
endif
endfor
release lock
process message
free message
endfor
Dopiero jeśli okaże się to do wprowadzenia niedopuszczalnych opóźnień w wątku pisarz pójdę zablokować wolne od kodu (chyba że zdarzyło mi się mieć odpowiednią kolejkę już leżącą w pobliżu).
Jaką bibliotekę wątków używasz? pthreads? –
doładowanie :: wątek i niektóre bity kodu specyficznego dla platformy tu i tam –
Twój cel może spowodować wyczerpanie pamięci, ponieważ nie pozwalasz, aby wątek programu piszącego blokował lub upuszczał elementy. Więc jeśli osiągniesz krytyczny limit wielkości kolejki, musisz zdecydować, czy upuścić przedmioty, czy zablokować wątek pisarza. W przeciwnym razie możesz upuścić przedmioty pośrednio, ponieważ Twój program się nie powiedzie :-) – mmmmmmmm