2015-09-21 30 views
5

我有一個使用Oracle Pro C預編譯器的多線程(基於posix線程或基於pthread的)C應用程序。該應用程序使用全局sqlca結構。在一個.c文件,它包括如Oracle數據庫訪問全局sqlca結構定義:用於Oracle數據庫訪問的線程安全全局sqlca結構

#include <sqlca.h> 

而在所有其他的C文件,它使用如下:

#define SQLCA_STORAGE_CLASS extern 
    #include <sqlca.h> 

我的問題是,如果更多比一個線程試圖訪問數據庫表以進行查詢,插入或更新並使用全局sqlca對象,我該如何保證互斥或使其成爲線程安全訪問? 另外,當我查詢vs插入/更新,他們都使用sqlca結構?

回答

1

你可以有一個全局函數來抓取一個互斥對象,一個全局函數返回一個互斥對象。

需要使用數據庫的線程會嘗試調用獲取互斥鎖的函數。如果互斥量已被使用,則該函數返回0.如果互斥量可用,則互斥量函數會將互斥量標記爲不可用,並返回1表示成功。

任何後續調用搶互斥鎖都將失敗,直到成功抓取互斥鎖的線程調用返回互斥鎖函數。

任何試圖抓取互斥鎖的線程都可以放入循環,直到互斥鎖被成功抓取爲止(即線程將等待互斥鎖)。這裏也可以制定暫停計劃。

互斥對象可以像布爾一樣簡單,也可以使用其他更復雜的互斥鎖(windows.h具有互斥對象)。

如果您創建自己的互斥鎖,它是非常重要的,它是不穩定的。

沒有線程可以訪問數據庫,如果它沒有擁有互斥體。