用于Oracle数据库访问的线程安全全局sqlca结构
我有一个使用Oracle Pro C预编译器的多线程(posix线程或基于pthread)C应用程序。应用程序使用全局sqlca结构。在一个.c文件中,它包括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_存储_类外部 #包括 我的
#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
)变量(注意:您应该零初始化它们);在函数内部,将使用这些。