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

时间:2015-09-21 07:10:46

标签: 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 struct吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

任何尝试和未能获取互斥锁的线程都可以进入循环,直到成功获取互斥锁(即线程将等待互斥锁)。也可以在这里设置超时。

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

如果您创建自己的互斥锁,那么它很不稳定很重要。

如果没有线程可以访问数据库,如果它没有互斥锁。