我有一个使用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吗?
答案 0 :(得分:1)
您可以拥有一个全局函数来获取互斥锁对象,以及一个返回互斥锁对象的全局函数。
需要使用数据库的线程尝试调用抓取互斥锁的函数。如果互斥锁已在使用中,则该函数返回0.如果互斥锁可用,则抓取互斥锁功能将互斥锁标记为不可用,并返回1表示成功。
任何后续的抓取互斥锁的调用都将失败,直到成功获取互斥锁的线程调用返回互斥锁函数。
任何尝试和未能获取互斥锁的线程都可以进入循环,直到成功获取互斥锁(即线程将等待互斥锁)。也可以在这里设置超时。
互斥对象可以像bool一样简单,也可以使用其他更复杂的互斥锁(windows.h具有互斥对象)。
如果您创建自己的互斥锁,那么它很不稳定很重要。
如果没有线程可以访问数据库,如果它没有互斥锁。