2015-09-21 16 views
5

Ho un'applicazione C multi-thread (posix o pthread based) che utilizza il precompilatore Oracle Pro C. L'applicazione utilizza una struttura globale sqlca. In un file .c, che comprende la definizione struct SQLCA globale per l'accesso al database Oracle come:Struttura sqlca globale thread-safe per l'accesso al database Oracle

#include <sqlca.h> 

E in tutti gli altri, i file C, utilizza come segue:

#define SQLCA_STORAGE_CLASS extern 
    #include <sqlca.h> 

La mia domanda è se più di un thread tenta di accedere a una tabella di database per interrogare, inserire o aggiornare e utilizza l'oggetto sqlca globale, come posso garantire l'esclusione reciproca o renderlo accesso thread-safe? Inoltre, quando eseguo query su insert/update, usano tutti struct sqlca?

risposta

1

Si potrebbe avere una funzione globale che acquisisce un oggetto mutex e una funzione globale che restituisce un oggetto mutex.

Il thread che deve utilizzare il database tenta di chiamare la funzione che acquisisce un mutex. Se il mutex è già in uso, la funzione restituisce 0. Se il mutex è disponibile, la funzione mutex grab contrassegna il mutex come non disponibile e restituisce un 1 per il successo.

Eventuali chiamate successive per l'acquisizione di mutex falliranno, finché il thread che ha afferrato con successo il mutex chiama la funzione di ritorno mutex.

Qualsiasi thread che tenta e non riesce a catturare il mutex PU be essere messo in un ciclo finché il mutex non viene afferrato correttamente (cioè il thread attenderà il mutex). Un timeout può anche essere istituito qui.

L'oggetto mutex può essere semplice come un bool oppure è possibile utilizzare altri mutex più complessi (windows.h ha oggetti mutex).

Se si crea il proprio mutex, è VITAMENTE importante che sia volatile.

Nessun thread può accedere al database se non è in possesso del mutex.