2012-08-11 21 views
12

Ho una domanda generale su thread e callback. Supponiamo per esempio di avere un thread in esecuzione continua insieme al programma principale.Query generale sulle funzioni di callback e thread

Il programma principale ha registrato una funzione di richiamata con il thread. In questo modo il thread può richiamare la funzione di callback in qualsiasi momento. Generalmente, registriamo un callback passando un puntatore a funzione al thread. Voglio sapere quando quella funzione di callback è chiamata dal thread, sarà una parte di quel thread o, farà parte del programma principale. Voglio conoscere il meccanismo di questo processo come il modo in cui l'esecuzione del programma principale viene interrotta o interrotta quando la chiamata viene richiamata dal thread. Un'altra cosa è il comportamento dello stack di chiamata della funzione quando viene richiamato il callback.

+0

Quale approccio per il multi-threading usi? – klm123

risposta

10

Come regola generale, le chiamate di funzione vengono sempre eseguite nel contesto del chiamante (thread). Non importa se il callee è una funzione, una funzione membro, un oggetto funtore o qualcos'altro.

In altre parole, quando il thread chiama la richiamata, la chiamata avviene nella discussione. Il thread principale non viene arrestato per eseguire il callback. In realtà, non è coinvolto in alcun modo con l'esecuzione del callback.

Vari framework forniscono trucchi per far sembrare che un thread possa chiamarne un altro direttamente, ma questo viene sempre fatto in modo cooperativo attraverso una sorta di meccanismo di trasmissione dei messaggi marshalling. Le discussioni generalmente non si intrecciano le une alle altre.

+1

Quindi, ad esempio, ho 2 funzioni nel mio programma principale. 1) FunzioneA() -> Questa è la richiamata 2) FunzioneB() -> questa è la funzione normale. Entrambe queste funzioni possono accedere a una variabile globale. Quindi in questo contesto è necessario un mutex su quella variabile. Causa la callback può occor in qualsiasi momento. –

+2

@ user1592046: Sì. Qualsiasi accesso concorrente (almeno uno dei quali è una scrittura) deve essere protetto da un qualche tipo di meccanismo di sincronizzazione. Se un thread desidera attendere che l'altro cambi la variabile, sarà necessario utilizzare un meccanismo di segnalazione come un semaforo o una variabile condizionale. –

+0

Grazie per il chiarimento :-) –