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

标签 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 对象,我如何保证互斥或使其成为线程安全访问? 另外,当我查询 vs 插入/更新时,它们都使用 sqlca 结构吗?

最佳答案

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

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

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

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

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

如果您创建自己的互斥量,那么它的 volatile 非常重要。

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

关于c - 用于 Oracle 数据库访问的线程安全全局 sqlca 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32689288/

相关文章:

c - 代码行为的解释

c - 从邻接矩阵中删除顶点的好方法

c++ - 如何设计多线程应用程序

mysql - 如何高效地存储位置和路径并找出最短的旅行路线

c - 我正在尝试创建一个程序来使用 c 搜索和替换文本文件中的单词

c - `out' 、 'in' 的操作数类型不匹配

c - APUE<2nd> 11.4,先发信号或先解锁

java - com.sun.HttpServer 套接字积压

sql - 对 xmlagg(xmlelement(...) 的结果进行排序

sql - 发生错误时从select语句继续插入