2015-09-21 31 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具有互斥对象)。

如果您创建自己的互斥锁,它是非常重要的,它是不稳定的。

没有线程可以访问数据库,如果它没有拥有互斥体。