我有一个使用 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/