2013-03-10 15 views
9

sto cercando di sostituire boost::lockfree::queue per std::queue in questo websocket ++ esempio https://github.com/zaphoyd/websocketpp/blob/experimental/examples/broadcast_server/broadcast_server.cppè boost :: lockfree :: queue not lockfree con C++ 11?

Sembra che può essere fatto senza realmente cambiare qualsiasi sintassi ancora rimuovendo le boost::unique_lock linee.

Tuttavia, quando guardo l'esempio spinta, ha una sezione di codice che controlla lockfree http://boost-sandbox.sourceforge.net/doc/html/lockfree/examples.html

Quando guardo attraverso i documenti sul lockfree::queue, si dice questo su is_lock_free()http://boost-sandbox.sourceforge.net/doc/html/boost/lockfree/queue.html:

bool is_lock_free (void) const;

Warning

It controlla solo, se la testa coda e nodi di coda e la freelist possono essere modificati in modo senza blocchi. Sulla maggior parte delle piattaforme, l'intera implementazione è bloccata, se questo è vero. Utilizzando l'atomizzazione in stile C++ 0x, non è possibile fornire un'implementazione completamente accurata, poiché è necessario testare ogni nodo interno, , impossibile se ulteriori nodi verranno allocati dal sistema operativo .

Restituisce: true, se l'implementazione è bloccata.

Non ho idea di cosa siano gli "atomi di stile 0x in C++", ma sono abbastanza sicuro che C++ 0x significhi C++ 11.

Sto usando C++ 11 e semplicemente sostituendo boost::lockfree::queue per std::queue, quindi questo non sarà implementato senza blocco?

+5

Vi esorto a misurare prima di commettere algoritmi privi di lock - sono accurati ma progettati per essere _scalable_ e _safe_ (cioè prevenire l'inversione di priorità) - le prestazioni sono meno preoccupanti e tipicamente peggiori. Ad esempio, l'implementazione della coda senza blocco di Boost sarà più lenta di una 'std :: queue 'bloccata a meno che tu non abbia diversi core e una quantità molto alta di contesa. –

+2

'Non ho idea di cosa stiano" C++ 0x-style atomics "sta parlando di [boost :: atomic] (http://www.boost.org/doc/libs/1_53_0_beta1/doc/html/atomic. html) su cui si basa la libreria. –

+0

+1 per l'esempio lib – ExoticBirdsMerchant

risposta

8

No. Il commento "Nessuna possibilità di fornire un'implementazione completamente accurata" si riferisce a is_lock_free() - ovvero non è garantito che is_lock_free() restituisca un risultato che rifletta accuratamente se l'implementazione è senza blocco. Tuttavia, se is_lock_free() restituisce true, è molto probabile che l'implementazione non sia bloccata, ma non assolutamente garantita la ghisa.

+0

Grazie! Diresti che è sicuro usare l'esempio sopra, o dovrei aspettarmi messaggi/connessioni persi su base regolare? –

+0

Perché ti aspetti che qualcosa si perda? –

+0

@CoryNelson Perché sono completamente C++ inesperto. 'is_lock_free' fa sembrare che ci possano essere situazioni in cui non è libero da lock, quindi qualcosa di" cattivo "potrebbe accadere come messaggi/connessioni persi. –

-7

Non ho idea di cosa siano gli "atomi di stile 0x in C++", ma sono abbastanza sicuro che C++ 0x significhi C++ 11.

  • C++ 0x riferisce a C++ 03 e/oC++ 07 standard C++.
  • C++ 1x di solito si riferisce a C++ 11
  • C++ 1y si riferisce al successore C++ 11.
+6

Questo è assolutamente errato. Sia C++ 0x che C++ 1x si riferiscono a C++ 11. C++ 1y si riferisce a C++ 14 o C++ 17, ma di solito il primo. –