2015-09-21 33 views
5

Mam aplikację wielowątkową (opartą na wątku lub pthread) C, która korzysta z prekompilatora Oracle Pro C. Aplikacja korzysta z globalnej struktury sqlca. W jednym pliku .c, obejmuje globalne SQLCA definicję struct do dostępu do bazy danych Oracle jako:Bezpieczna dla wątków globalna struktura sqlca dla dostępu do bazy danych Oracle

#include <sqlca.h> 

i we wszystkich innych, pliki C, używa się następująco:

#define SQLCA_STORAGE_CLASS extern 
    #include <sqlca.h> 

Moje pytanie brzmi, czy bardziej niż jeden wątek próbuje uzyskać dostęp do tabeli bazy danych dla zapytania, wstawienia lub aktualizacji i używa globalnego obiektu sqlca, w jaki sposób mogę zagwarantować wzajemne wykluczenie lub umożliwić dostęp do wątków? Również, gdy zapytanie vs vs wstaw/aktualizacji, oni wszyscy używają sqlca struct?

Odpowiedz

1

Możesz mieć funkcję globalną, która pobiera obiekt mutex, oraz funkcję globalną, która zwraca obiekt mutex.

Wątek, który musi korzystać z bazy danych, próbuje wywołać funkcję przechwytującą muteks. Jeśli muteks jest już w użyciu, funkcja zwraca wartość 0. Jeśli muteks jest dostępny, funkcja grab mutex oznacza, że ​​muteks jest niedostępny i zwraca 1, aby odnieść sukces.

Każde kolejne wywołanie pobierania obiektu mutex zakończy się niepowodzeniem, dopóki wątek, który pomyślnie przechwycił muteks, nie wywoła funkcji return mutex.

Każdy wątek, który próbuje pobrać i nie może pobrać muteksu MOŻE być wprowadzony w pętlę, dopóki muteks nie zostanie skutecznie przechwycony (tj. Wątek będzie czekać na muteks). Można również ustanowić limit czasu.

Obiekt mutex może być tak prosty jak bool, lub można użyć innych bardziej złożonych muteksów (windows.h ma obiekty mutex).

Jeśli utworzysz własny muteks, Zasadniczo ważne jest, aby był niestabilny.

Żaden wątek nie może uzyskać dostępu do bazy danych, jeśli nie jest w posiadaniu muteksa.