我正在尝试在一个多线程的C++程序中使用SQLite 3.7.5。我已经将问题缩小到了几行简单的代码:
sqlite3 *Database;
sqlite3_stmt *Stmt;
int retval=sqlite3_open("database.db3",&Database);
retVal=sqlite3_prepare(&Database,"CREATE TABLE RawData (Key CHAR(5))",-1,&Stmt,0);
retval=sqlite3_step(Stmt);
retval=sqlite3_finalize(Stmt);
当我从主进程直接调用这段代码时,它可以正常工作。但是,如果我使用CreateThread()来创建一个线程:
unsigned long ThreadId;
CreateThread(0,0,(LPTHREAD_START_ROUTINE) InserterThread,&Info,0,&ThreadId);
在 sqlite3_step 调用中,我收到了 "buffer overrun" 的 Visual Studio 消息。如果我调试,我会看到崩溃位置在 dbghook.c 的 _CRT_DEBUGGER_HOOK 中。
我正在使用多线程静态 VC 库,并使用以下定义进行编译:
SQLITE_THREADSAFE=2
THREADSAFE=2
我已经通过 sqlite3_threadsafe() 进行了验证。
我可以追踪一点 SQLite 3 代码,但我希望有人能够发现我的代码中的明显问题并帮我避免麻烦。