2014-04-06 7 views
5

Dokumentacja dla kolejki boost :: lockfree :: wspomina, że ​​push może przydzielić więcej miejsca w razie potrzeby. Jednak nie mogę dla mojego życia wymyślić, jak utworzyć taką kolejkę i nie mogę znaleźć tego przykładu. Wszystkie przykłady na stronie doładowania mają stałą pojemność.W jaki sposób można dokonać zmiany :: kolejka bez blokady :: kolejka dynamicznie zmienia rozmiar

Jest to dokumentacja Szukałem na stronie: http://www.boost.org/doc/libs/1_54_0/doc/html/boost/lockfree/queue.html

Odpowiedz

6

Domyślnym jest kolejka być zmienna wielkości. Jest to kontrolowane przez parametr szablonu typename ...Options.

Ponadto istnieje błąd, w którym kolejka wymaga statycznie ustalonej pojemności, nawet jeśli kolejka ma zmienną wielkość. Można tego uniknąć, używając konstruktora, który ma początkową pojemność.

zmienna kolejka wielkości można wystąpienia jako:

boost::lockfree::queue<T> newQueue(0); 
// or equivalently: 
boost::lockfree::queue<T, boost::lockfree::fixed_sized<false> > newQueue(0); 

stałą wielkości kolejkę musi dokładnie określonych opcji fixed_sized do true lub dostarczania wielkości z możliwością boost::lockfree::capacity.

Zobacz sekcję Policies w pobliżu początku dokumentacji, z którą się łączyłeś.

+0

Dzięki za odpowiedź. Czuję, że muszę się z czymś pomylić. Jeśli tworzę instancję kolejki tak, jak tutaj sugerujesz, to kończy się niepowodzeniem z asercją "Asercja' has_capacity "nie powiodła się." Mogę przekazać konstruktorowi rozmiar, który nie trafia tego stwierdzenia, ale wydaje się, że zachowuje się w sposób fixed_size. –

+1

Zobacz moją edycję. Uważam, że to stwierdzenie jest nieważne (to jest błąd w Boost.Lockfree). Wymaganie powinno być albo udokumentowane, albo asercja powinna zostać zmieniona, aby również sprawdzić, czy kolejka jest w rzeczywistości wielkością stałą. – Mankarse

+0

Myślę, że twierdzenie jest w porządku. Potwierdza, że ​​** musi ** być początkową wydajnością (albo dlatego, że jest ustalona, ​​**, albo **, ponieważ została przekazana w konstrukcji). Budowa kolejki o dynamicznym rozmiarze bez początkowej pojemności jest nielegalna. Czy możesz odwołać się do odpowiedniego raportu o błędzie/dyskusji, aby potwierdzić swoje twierdzenie, że "jest błąd"? – sehe