2012-07-09 13 views
8

Nelle note di rilascio della versione 1.50.0 delle librerie Boost ho notato due cambiamenti di rottura (see here):Rompere cambiamenti nella Boost.Thread 3.0.0

# 6266 Rompere il cambiamento: filo distruttore dovrebbe chiamare terminare se condivisibile.

# 6269 Rompere il cambiamento: filo assegnazione mossa dovrebbe chiamare terminare se accostabile.

Cosa significa questo per i miei progetti esistenti che attualmente utilizzano Boost 1.49.0? Devo cambiare qualcosa? Se sì, cosa devo cambiare esattamente? E cosa succede se dimentico di modificare uno dei miei progetti esistenti? Otterrò errori di compilazione (spero di si) o avrò problemi di runtime brutti e difficili da trovare (non lo spero assolutamente)?

risposta

7

Quando si dice "Breaking cambiamento", significa, "Il vostro programma è rotto se si dipende da un comportamento che in precedenza era X, ma è ora Y".

per il dato due cambi, significa che se si basano su l'assegnazione distruttore o spostare chiamando join() (o detach()), che credo sia stato il comportamento precedente, il programma deve ora esplicitamente join() o detach() o incontrare tuo amico std::terminate() . Non si tratta di un errore in fase di compilazione, ma non è un comportamento imprevedibile del run-time - si otterrà un bel crash pulito che riporta al distruttore di boost::thread, che è la causa del problema.

+1

noti che chiama terminare se joinabile, cioè non terminerà se l'oggetto thread non è stato aggiunto in precedenza ma è staccato. – PlasmaHH

+1

Sì, ho dimenticato di 'detach()'. – Puppy

7

Il codice seguente usata per funzionare correttamente, ma con v3 programma verrebbe abortita t lascia sua portata, perché thread::~thread chiamate std::terminate, invece di silenzio distacco dalla filettatura:

#include <boost/thread.hpp> 
#include <iostream> 

void f() 
{} 

int main() 
{ 
    { 
    boost::thread t(f); 
    } 
    std::cout << "exiting gracefully" << std::endl; 
} 
Problemi correlati