2012-05-07 29 views
7

Tengo una función llamada workForThread, que toma dos argumentos y devuelve vacío. Me gustaría enhebrar esta función usando algo como:Pasar múltiples argumentos a una función de enhebrar

thread(workForThread,a,b); 

Dónde a y b son de los tipos apropiados. El código anterior no se compila, dando un error de "demasiados argumentos para llamar" ("error C2197: 'void (__cdecl *) (char *)': demasiados argumentos para la llamada")

¿Cómo puedo resolver esto? ?

Nota: He mirado thesetwo preguntas, pero las resoluciones que trabajan allí no parece funcionar para mí. Además, tengo la sensación de que hay una manera de hacerlo integrado en C++ 11, y eso es lo que estoy buscando.

+1

C++ 11 thread tiene un constructor (con plantilla) que hace exactamente eso. – Mat

+0

Entonces, ¿por qué me está dando ese error? – soandos

+0

¿Qué versión de VS tienes? Tal vez no sea compatible con eso. – Mat

Respuesta

7

Al usar C++ 11 puede usar una función lambda que puede usar el parámetro (no formal) del contexto. "La captura de"

Algo así como

void doIt (int a, int b) { // do something, your workForThread 
} 

.. 
int a = 1; 
int b = 2; 

std:thread r ([=](){doIt (a, b); return 1;}); 

Cuando sólo llamar a una respuesta única función juanchopanza puede ser algo más eficiente, ya que no se creará una nueva función.

La versión lambda le permite configurar más. Supongamos que está iniciando subprocesos que llama al final 2 funciones de 3. enfoque de juanchopanza requeriría funciones NOMBRADAS para cada permutación.

Por el momento, considero que la diferencia de ambos enfoques es principalmente una cuestión de gusto.

Cuando te gusta leer más acerca de las funciones lambda

What is a lambda expression in C++11?

+0

¿Puede por favor mostrarme lo que quiere decir? No tengo experiencia con C++ lambdas – soandos

+0

¿Dónde está mi función? – soandos

+0

Esto ahora compila, pero produce un error fatal en "__declspec (noinline) void __cdecl _CRT_DEBUGGER_HOOK (int _Reserved)" ¿Alguna idea de qué está causando esto? – soandos

13

En C++ 11, la forma de hacerlo es más o menos la forma en que han intentado:

std::thread myThread(workForThread,a,b); 

siempre que workForThread sea una función (no miembro) que tome esos dos parámetros.

+0

quizás agregue que la función puede no estar sobrecargada. Creo que ese es el problema en su caso. – inf

+0

@bamboon ¿qué quiere decir con sobrecarga? – juanchopanza

+0

digamos que tiene workforthread (int, int) y workforthread (int), entonces esto no se compilará. – inf

Cuestiones relacionadas