2012-08-17 4 views
5

Sto scrivendo una libreria condivisa in C. So che le funzioni C non sono thread-safe.Creazione di una libreria C thread-thread

mie routine di libreria sembra,

struct lib_handle { 
.... 
}; 

int lib_init(lib_handle **handle); 
int lib_process(lib_handle *handle); 
.... 
.... 

Ogni metodo prende un puntatore a lib_handle oggetto. Tutto lo stato è memorizzato all'interno di questa struttura. Non vengono utilizzate variabili globali.

Suppongo che se ogni thread crea le proprie istanze lib_handle, più thread possono utilizzare le funzioni della libreria. Poiché ogni thread ha il proprio handle, everythibg dovrebbe funzionare.

Non ho ancora convalidato questa ipotesi. Mi sto chiedendo cosa ne pensate di questo design e voi posso affermare la mia libreria come thread safe dato che ogni thread ha le proprie maniglie?

Qualsiasi aiuto sarebbe fantastico!

+0

Questa libreria non utilizza alcuna libreria diversa da SQLite. SQLite stesso è thread-safe. –

+0

Ehi, +1, finalmente una domanda sensata. –

risposta

3

Ciò renderà sicuri i dati/lo stato del thread della libreria.

Tuttavia, è necessario assicurarsi che la libreria usi funzioni thread-safe da altre librerie, ad es. utilizzare strtok_r anziché strtok.

+0

Sì. Hai ragione. Che ne è delle altre funzioni delle funzioni di libreria standard? –

+0

@Appu Principalmente le funzioni standard sono thread-safe se non diversamente specificato. Il modo migliore è guardare la pagina man della funzione. – Rohan

1

I thread funzionano nello spazio di memoria condiviso. Gli oggetti non sicuri sono gli oggetti a cui è possibile accedere simultaneamente da più thread. Quindi se hai un singolo oggetto lib_handle per ogni thread non ci saranno problemi.

0

Se ciascun thread ha un oggetto lib_handle privato, la libreria deve essere completamente protetta da thread; se lasci che diversi thread condividano oggetti lib_handle, la persona che usa la tua libreria può ancora fare un programma thread-safe se usa correttamente la tua libreria (cioè la tua libreria non è intrinsecamente thread-safe che sarebbe se tu usassi e.g. variabili globali).

Se questa modalità di funzionamento (condivisa lib_handle) è interessante, è necessario separare chiaramente le funzioni che leggono solo lo stato di lib_handle e quelle che manipolano lo stato di lib_handle. Il primo ha bisogno di un blocco di lettura e quest'ultimo ha bisogno di un blocco di scrittura (l'ambito di chiamata deve gestirlo).

Per quello che vale ho usato lo schema che descrivi abbastanza e piace.