In base allo standard C++ 14, le variabili membro non statiche vengono inizializzate nell'ordine in cui sono dichiarate in una classe. Il codice ridotto qui sotto si basa su questa regola per controllare una funzione thread.Fare affidamento sull'ordine di inizializzazione
class foo
{
foo():
keep_going{true},
my_thread(&foo::go,this)
{}
void go()
{
while(keep_going)
check a std::condition_variable and do some work;
}
bool keep_going;
std::thread my_thread;
}
noti che keep_going
viene dichiarata prima che l'oggetto filo e deve essere impostato true
dal momento in cui il filo entra nella funzione go. Questo va bene e sembra funzionare bene.
Tuttavia, questo è il codice multithreaded e vale la pena di essere paranoico così ho due domande:
1 E 'sicuro di fare affidamento su ordine di inizializzazione in questo modo? Il mio vero oggetto non ha senso senza il thread di elaborazione, quindi voglio impostarlo nel costruttore.
2 È pericoloso dare il codice agli altri quando si basa su cose relativamente oscure come l'ordine di inizializzazione?
L'ordine di inizializzazione non è oscuro, è ben definito e non c'è nulla di sbagliato in questo codice. – Salgar
1) sì l'ordine di inizializzazione fa parte delle specifiche, 2) sì - la documentazione chiara potrebbe aiutare – BeyelerStudios
Mi baserei su di esso solo con un buon commento che spiega. Segui la citazione "Codice sempre come il tuo mantainer del codice è un serial killer che sa dove vivi" –