Vorrei utilizzare una classe che gestisce un thread (o più thread). Utilizzando la composizione, questo sarebbe simile:Esiste un modo sicuro per avere un file std :: thread come membro di una classe?
class MyClass{
private:
std::thread mythread;
void _ThreadMain();
public:
MyClass();
// other fields
}
Poiché il costruttore predefinito per un std::thread
è inutile, avrei bisogno di chiamare esplicitamente in MyClass
costruttore:
MyClass::MyClass() : mythread(&MyClass::_ThreadMain,this) {}
Tuttavia, in questo caso il _ThreadMain
il metodo sarà probabilmente eseguito prima cheMyClass
sia stato creato, causando qualsiasi tipo di comportamento strano. Questo è chiaramente pericoloso. Come posso risolvere questo?
Una soluzione ovvia sarebbe quella di utilizzare un puntatore a std::thread
invece, e aggiungere un'altra funzione membro:
void MyClass::Start(){
// This time mythread is of type std::thread*
mythread = new std::thread(&MyClass::_ThreadMain,this); // One could use std::unique_pointer instead.
}
che accendere quel filo. In questo caso verrebbe chiamato dopo che la classe è stata costruita, che sarà davvero sicura.
Tuttavia, mi chiedo se esiste una soluzione ragionevole che mi consenta di non utilizzare i puntatori per questo. Sembra che dovrebbe essere possibile in qualche modo (hey, ci deve essere un modo per lanciare un thread quando una classe è costruita!), Ma non riesco a trovare nulla che non possa causare problemi.
Ho considerato l'utilizzo di una variabile condizionale in modo che attenda fino a quando il costruttore non ha eseguito il suo lavoro, ma non posso utilizzarne uno prima che la classe sia costruita, giusto? (Questo sarebbe anche inutile se MyClass
era una classe derivata)
Ometti il 'new' a' mythread = new std :: thread (& MyClass :: _ ThreadMain, this); ',' std :: thread' è mobile! Considera 'std :: bind' per legare la tua funzione membro della classe. –
Puoi lasciare che il thread aspetti (all'inizio) finché non viene detto di procedere. –
Il problema qui è che se il metodo '_ThreadMain' è virtuale, il thread chiamerà la funzione sbagliata. Sarei molto interessato a vedere una soluzione a questo in cui il costruttore fa la cosa giusta. –