Todas las sugerencias que se aportaron anteriormente son correctas para los programas secuenciales, me refiero a los programas sin hilos. El uso de hilos cambia las cosas. En primer lugar, los parámetros predeterminados para std :: thread son funciones y parámetros de funciones. Probablemente estabas estudiando el libro "concurrencia C++ en acción", y el autor muestra un ejemplo interesante:
void do_some_work();
thread my_thread(do_some_work); //thread receives the function address
Supongamos que esta función:
vacío do_other_job (int k); En el cuerpo del código, que debe hacer:
k=3;
thread my_thread2(do_other_job, k);
con el fin de generar otro hilo.
Por lo tanto, utilizando hilos el compilador interpreta f (en std :: thread my_thread (f);) de forma predeterminada como una función en lugar de una clase. Para cambiar eso, debe iniciar un operador() para advertir al compilador que está trabajando con una clase. Un código alternativa podría ser:
class background_task{
public:
background_task(){
do_sth();
do_sth_else();
}
void operator()(){}
};
background_task f;
thread mythread10(f);
Con el tiempo, no es correcta, utilizando hilos, alimentando el operador, por lo que este código no funciona:
void operator()(int x){
do_sth();
cout<<"x = "<<x<<endl;
}
Esto sucede porque todo el código dentro de la los corchetes son de solo lectura y no se pueden cambiar durante el tiempo de ejecución. Si intenta insertar una variable en el constructor, debe colocarla en la inicialización del hilo. Por lo tanto:
class backg{
public:
backg(int i){
do_sth(i);
}
void operator()(){}
};
int main(){
thread mythread{ backg(12) }; //using c++11
return 0;
}
se ejecutará sin errores, y llevará a cabo la función de do_sth (12) en el subproceso generado.
Espero haber ayudado.
genial, más claro ahora. –
¿Hay alguna llamada implícita para operator()() excepto esta llamada explícita task()? –
@ forester2012, no siempre debe llamarlo explícitamente, aunque también puede usar la sintaxis 'task.operator()()' mucho más incómoda. Hay muchos algoritmos estándar que llamarán a este operador internamente. –