Più thread che effettuano chiamate alla libreria precompilata

1

Mi è stata fatta questa domanda in un'intervista e ho pensato di prendere consigli da voi ragazzi.

Dire che ho una libreria precompilata che fa riferimento a qualche funzione che dice "strtok".

Non c'è codice sorgente per questa libreria.

$ nm lib.a | grep strtok
      U _strtok

Il tuo sistema di destinazione utilizza un RTOS e hai più thread che effettuare chiamate nella libreria.

D) Perché questo potrebbe essere un problema?

A mio parere, questo non dovrebbe essere un problema. Voglio dire, non c'è niente di sbagliato nel chiamare la stessa funzione da thread diversi. Se vuoi assicurarti che le tue variabili siano coerenti, è consigliabile fornire meccanismi di sincronizzazione dei thread per prevenire arresti anomali e condizioni di gara

    
posta samprat 15.06.2015 - 16:44
fonte

2 risposte

5

strtok non è thread-safe perché salva il suo stato nella memoria statica tra le chiamate. Se due thread fanno chiamate concomitanti o interfogliate a strtok, otterranno risultati errati. La variante strtok_r restituisce un puntatore al chiamante da utilizzare per invocazioni future sulla stessa stringa. Ci sono molte altre funzioni C e POSIX che non sono sicure da usare da più thread. [1,2]

Nel software moderno, in cui il multithreading è comune, è meno probabile che gli implementatori di librerie creino funzioni non sicure come questa. Tuttavia, non puoi presumere che sia il caso per impostazione predefinita.

  1. Thread-safety e POSIX.1
    link
  2. La libreria GNU C: Nonreentrancy
    link
risposta data 15.06.2015 - 17:56
fonte
0

If you want to ensure that your variables are consistent it is advisable to provide thread synchronization mechanisms to prevent crashes and race conditions

Penso che tu abbia appena colpito quello che cercavano. In qualsiasi lingua ne avrete parti che non sono thread safe e necessitano di meccanismi di sincronizzazione per prevenire problemi (guarda l'elenco .net per un esempio specifico che conosco). Questo è ancora più vero con le librerie di terze parti.

Chiamare la stessa funzione da 2 thread è solo problematico quando la sincronizzazione non è considerata e la libreria non è thread-safe *.

* naturalmente ci possono essere specifiche di cui non sono a conoscenza.

    
risposta data 15.06.2015 - 17:20
fonte

Leggi altre domande sui tag