用于Oracle数据库访问的线程安全全局sqlca结构

用于Oracle数据库访问的线程安全全局sqlca结构,c,multithreading,oracle,thread-safety,global-variables,C,Multithreading,Oracle,Thread Safety,Global Variables,我有一个使用Oracle Pro C预编译器的多线程(posix线程或基于pthread)C应用程序。应用程序使用全局sqlca结构。在一个.c文件中,它包括Oracle数据库访问的全局sqlca结构定义,如下所示: #include <sqlca.h> #包括 在所有其他c文件中,它使用如下: #define SQLCA_STORAGE_CLASS extern #include <sqlca.h> #定义SQLCA_存储_类外部 #包括 我的

我有一个使用Oracle Pro C预编译器的多线程(posix线程或基于pthread)C应用程序。应用程序使用全局sqlca结构。在一个.c文件中,它包括Oracle数据库访问的全局sqlca结构定义,如下所示:

   #include <sqlca.h>
#包括
在所有其他c文件中,它使用如下:

   #define SQLCA_STORAGE_CLASS extern
   #include <sqlca.h>
#定义SQLCA_存储_类外部
#包括
我的问题是,如果有多个线程试图访问数据库表进行查询、插入或更新,并使用全局sqlca对象,那么如何保证互斥或使其成为线程安全的访问?
另外,当我查询vs insert/update时,它们是否都使用sqlca结构?

您可以使用一个全局函数来获取互斥对象,以及一个全局函数来返回互斥对象

需要使用数据库的线程尝试调用获取互斥锁的函数。如果互斥已在使用,则函数返回0。如果互斥体可用,则grab mutex函数将互斥体标记为不可用,并返回1表示成功

任何后续的获取互斥体的调用都将失败,直到成功获取互斥体的线程调用return mutex函数

任何试图抓取互斥锁但失败的线程都可以放入循环,直到成功抓取互斥锁为止(即线程将等待互斥锁)。也可以在此处设置暂停

互斥对象可以像bool一样简单,也可以使用其他更复杂的互斥对象(windows.h有互斥对象)

如果您创建自己的互斥体,那么它的易变性至关重要


如果没有互斥锁,任何线程都不能访问数据库。

好的,您可以在函数中定义本地
struct-sqlca-sqlca
(和
struct-oraca-oraca
)变量(注意:您应该零初始化它们);在函数内部,将使用这些。