2010-07-05 16 views
16

¿Es seguro, por ejemplo, hacer:¿Es seguro que varios subprocesos invoquen la misma función?

void AddTwo(int &num) 
{ 
    num +=2; 
} 


void ThreadProc(lpvoid arg) 
{ 
AddTwo((int)arg); 

} 

sería seguro para que esto ocurra si 4 hilos estaban haciendo esto, al mismo tiempo? Gracias

+1

¿De dónde viene 'arg'? –

+0

Acabo de hacer esto como un ejemplo, sé que esto no es "correcto" – jmasterx

Respuesta

20

La función en sí es segura para llamar. Se vuelve peligroso si todos intentan operar en la misma variable.

+0

¿Quiere decir que una variable que no forma parte de la función se llama derecha, como si AddTwo modificara una variable global? – jmasterx

+2

Correcto. Estoy hablando de las referencias numéricas de direcciones, no de 'num' en sí mismo. Su ejemplo de tratar de modificar una variable global a partir de varios hilos es uno de los casos problemáticos. – Shirik

+0

Está bien, bueno, mi aplicación dividirá el trabajo, así que esto no debería ser un problema, ¡gracias! – jmasterx

2

No hay nada de malo en llamar a la misma función desde diferentes hilos. Si desea asegurarse de que sus variables sean consistentes, es aconsejable proporcionar mecanismos de sincronización de subprocesos para evitar bloqueos, condiciones de desarrollo alternativo.

1

La seguridad depende del valor de lpvoid arg.

Si todos los argumentos son diferentes entre sí, entonces seguro que no.

Para hacer que la llamada a la función sea segura, revise 'mutex'.

0

La verdadera respuesta es - depende ...

En la mayoría de las plataformas, sí que es seguro, siempre y cuando no se hace nada inseguro en la función que otros han mencionado. ¡Es fácil arruinarlo así que ten cuidado!

En otras plataformas es definitivamente inseguro. Por ejemplo, la mayoría de los compiladores C para los microcontroladores PIC más pequeños no pueden soportar esto debido a limitaciones de hardware.

En general, sí, es seguro.

1

Como regla general, una función es reentrante si no altera ningún recurso común (por ejemplo, las mismas ubicaciones de memoria). Si lo hace, debe usar algún tipo de mecanismo de sincronización como mutexes o semáforos.

Cuestiones relacionadas