2010-07-13 6 views
7

Stavo passando per uno re-entrancy guide sulle pratiche raccomandate durante la scrittura del codice del nuovo concorrente.Prassi raccomandate per il codice del nuovo concorrente in C, C++

Quali altri riferimenti e risorse trattano questo argomento?

Quali strumenti di tipo lanuginoso possono essere utilizzati per verificare questi problemi?

+0

che guidano ha praticamente tutto quello che dovete sapere. Non è una cosa molto sottile. Non utilizzare dati che non sono stati trasferiti nella chiamata di funzione, non memorizzare alcun stato nella funzione. –

+1

Questa guida ha numerosi errori in essa, da una definizione di rientranza che in realtà è il multithreading (benché gli esempi di elaborazione del segnale siano veri reentrancy) ai cattivi consigli (mutexes ... ciao deadlock) al semplice bugginess ('sigsuspend (& zeromask)'. . hai appena autorizzato l'elaborazione degli interrupt che il tuo chiamante ha disabilitato per un motivo, prova invece 'sigsuspend (& oldmask) '. –

risposta

0

La guida è sufficiente.

mia regola personale dei pollici, sono solo 2 per riscrivere i codici rientrante:

  1. take passaggio solo da parametri di valore, usate solo valore passato come parametri nella funzione.

  2. se ho bisogno di utilizzare qualsiasi parametro globale o puntatore (per prestazioni o sake di archiviazione), utilizzare un mutex o semaforo per controllare l'accesso ad esso.

+0

Se sono necessari tipi complessi, renderli immutabili se possibile – fmark

+0

Hi fmark: puoi spiegarci un ulteriore? Oppure indicarmi qualcosa relativo a questa affermazione? – ttchong

+8

no No NO! Reentrancy! = Threading. Mutex e semafori metteranno a tacere il codice di rientro, oppure silenziosamente non faranno il loro lavoro e lasceranno il danneggiamento dei dati. –

1

Nessuno davvero. Scrivere codice non rientranti è di solito più difficile del rientro. Segui semplicemente queste semplici linee guida e non cercare di fare nulla di troppo sveglio e starai bene.

Il codice non rientranti viene in genere scritto per problemi ad alte prestazioni.

1
  • utilizzati variabili locali.
  • Non utilizzare locali statici o variabili globali, anche TLS non ti aiuterà con la ricorsione/ripetizione.
  • Ripristina tutti i tuoi invarianti prima di fare callback.
  • Non bloccare i blocchi mentre si effettuano le richiamate. Se devi assolutamente (e continuerei a cercare un modo per evitarlo) assicurati di sapere cosa succede se provi a reinserire il blocco sul thread che già lo contiene. Come minimo è necessario testare questo, altrimenti, a seconda del blocco, si verificheranno deadlock o invarianti interrotti (cioè la corruzione).
0
  1. Una funzione rientrante non può utilizzare le variabili in modo non atomico meno che non siano memorizzati sullo stack del task richiamante o sono le variabili private di questo compito.
  2. Una funzione di rientro non può chiamare altre funzioni che non sono rientranti.
  3. Una funzione di rientro non può utilizzare l'hardware in modo non atomico.

Rif: Pagina 462 [INTRODUZIONE L'UTILIZZO DEL RENESAS RX62N MICROCONTROLLORE] [James M. Conrad]