Tutti i suggerimenti forniti in precedenza sono corretti per programmi sequenziali, ovvero programmi senza thread. Usando le discussioni le cose cambiano. Prima di tutto, i parametri predefiniti per std :: thread sono parametri di funzioni e funzioni. Probabilmente si stava studiando il libro "concorrenza C++ in azione", e l'autore mostra un esempio interessante:
void do_some_work();
thread my_thread(do_some_work); //thread receives the function address
Supponiamo questa funzione:
vuoto do_other_job (int k); Nel corpo del codice, si dovrebbe fare:
k=3;
thread my_thread2(do_other_job, k);
al fine di generare un altro thread.
Quindi, utilizzando i thread il compilatore interpreta f (in std :: thread my_thread (f);) come funzione predefinita anziché come classe. Per cambiare devi avviare un operatore() per avvisare il compilatore che stai lavorando con una classe. Un codice alternativo potrebbe essere:
class background_task{
public:
background_task(){
do_sth();
do_sth_else();
}
void operator()(){}
};
background_task f;
thread mythread10(f);
Infine, non è corretto, utilizzando thread, alimentando l'operatore, pertanto questo codice non funziona:
void operator()(int x){
do_sth();
cout<<"x = "<<x<<endl;
}
Succede perché tutto il codice all'interno le parentesi sono di sola lettura e non possono essere modificate durante il tempo di esecuzione. Se si mira a inserire una variabile nel costruttore, è necessario inserirlo nell'inizializzazione del thread. Quindi:
class backg{
public:
backg(int i){
do_sth(i);
}
void operator()(){}
};
int main(){
thread mythread{ backg(12) }; //using c++11
return 0;
}
verrà eseguito senza errori, e si esibirà la funzione do_sth (12) nel thread generato.
Spero di aver aiutato.
fresco, più chiaro ora. –
Esistono chiamate implicite per operator()() ad eccezione di questa esplicita chiamata call()? –
@ forester2012, no devi sempre chiamarlo in modo esplicito anche se puoi usare anche la sintassi 'task.operator()()' molto più scomoda. Esistono molti algoritmi standard che chiameranno questo operatore internamente. –