2013-03-10 26 views
9

próbuję zastąpić boost::lockfree::queue dla std::queue w tym websocket ++ przykład https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppis boost :: lockfree :: queue not lockfree with C++ 11?

Wygląda jak można to zrobić bez zmieniania żadnych składni naprawdę jeszcze usuwając boost::unique_lock linie.

Jednak kiedy patrzę na przykład doładowania, ma sekcję kodu, który sprawdza lockfree http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples.html

Kiedy patrzę przez docs na lockfree::queue, to mówi to na is_lock_free()http://boost-sandbox.sourceforge.net/doc/html/boost/lockfree/queue.html:

bool is_lock_free (void) const;

ostrzegawczy

on jedynie sprawdza, czy głowica kolejki i węzły ogona i freelist mogą być modyfikowane w sposób wolny od zamka. Na większości platformach cała implementacja jest blokowana, o ile to prawda. Używając atomów w stylu C++ 0x , nie ma możliwości zapewnienia całkowicie dokładnej implementacji , ponieważ trzeba przetestować każdy węzeł wewnętrzny, , co jest niemożliwe, jeśli kolejne węzły zostaną przydzielone z systemu operacyjnego .

Zwraca: prawda, jeśli wdrożenie jest blokowane.

Nie mam pojęcia, czym są "atomizery w stylu C++ 0x", ale jestem całkiem pewny, że C++ 0x oznacza C++ 11.

Używam C++ 11 i tylko zastępuję boost::lockfree::queue dla std::queue, więc czy nie zostanie to zaimplementowane jako blokada?

+5

Zachęcam do pomiarów przed zatwierdzeniem algorytmów bez blokady - są one schludne, ale zaprojektowane tak, aby były _scalable_ i _safe_ (tj. Zapobiegają inwersji priorytetów) - wydajność jest mniej niepokojona i zazwyczaj gorsza. Na przykład implementacja kolejki wolnej od Boosta będzie wolniejsza niż zablokowana 'std :: queue', chyba że masz kilka rdzeni i bardzo dużą ilość rywalizacji. –

+2

'Nie mam pojęcia, co" atomic w stylu C++ 0x "mówi" o [boost :: atomic] (http://www.boost.org/doc/libs/1_53_0_beta1/doc/html/atomic. html), na którym opiera się biblioteka. –

+0

+1 dla przykładu lib – ExoticBirdsMerchant

Odpowiedz

8

Nie. Komentarz "brak możliwości przedstawienia w pełni dokładnego wdrożenia" odnosi się do is_lock_free() - tj. Nie jest gwarantowane, że is_lock_free() zwraca wynik, który dokładnie odzwierciedla, czy implementacja jest zablokowana. Jednakże, jeśli is_lock_free() zwraca wartość true, jest całkiem prawdopodobne, że implementacja jest wolna od blokady - ale nie absolutnie gwarantowana żeliwo.

+0

Dziękuję! Czy uważasz, że można go bezpiecznie używać w powyższym przykładzie, czy też powinienem regularnie oczekiwać utraconych wiadomości/połączeń? –

+0

Dlaczego miałbyś się spodziewać, że coś zginie? –

+0

@CoryNelson Ponieważ jestem całkowicie niedoświadczony ++. 'is_lock_free' sprawia, że ​​brzmi to tak, jakby zdarzały się sytuacje, w których nie jest zablokowany, więc może wydarzyć się coś" złego ", jak zgubione wiadomości/połączenia. –

-7

Nie mam pojęcia, czym są "atomizery w stylu C++ 0x", ale jestem całkiem pewny, że C++ 0x oznacza C++ 11.

  • C++ 0x oznacza C++ 03 i/lub C++ 07 ++ C standardów.
  • C++ 1x zwykle odnosi się do C++ 11
  • C++ 1y odnosi się do następcy C++ 11.
+6

To całkowicie niepoprawne. Zarówno C++ 0x, jak i C++ 1x odnoszą się do C++ 11. C++ 1y odnosi się do C++ 14 lub C++ 17, ale zwykle do pierwszego. –