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

Dr.*_*ana 6 c oracle multithreading global-variables thread-safety

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

   #include <sqlca.h>
Run Code Online (Sandbox Code Playgroud)

在所有其他的c文件中,它使用如下:

   #define SQLCA_STORAGE_CLASS extern
   #include <sqlca.h>
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果多个线程试图访问数据库表进行查询,插入或更新并使用全局sqlca对象,我如何保证互斥或使其成为线程安全访问?另外,当我查询vs插入/更新时,他们都使用sqlca结构吗?

Mik*_*son 1

您可以有一个获取互斥对象的全局函数,以及一个返回互斥对象的全局函数。

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

任何后续对获取互斥锁的调用都将失败,直到成功获取互斥锁的线程调用返回互斥锁函数。

任何尝试获取互斥锁但失败的线程都可以放入循环中,直到成功获取互斥锁(即线程将等待互斥锁)。也可以在这里设置暂停。

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

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

如果没有互斥锁,则任何线程都无法访问数据库。