我有一个受我自己的锁定保护的 sqlite 数据库。在生产者线程上,我准备了一个带有绑定值的语句。在消费者线程上,我运行该语句。
这是一些代表我的实现的伪代码:
class Database
{
sqlite3_stmt* prepare(const char* statementStr)
{
boost::mutex::scoped_ptr lock(myMutex);
sqlite3_stmt* stmt;
sqlite3_prepare_v2(mySqlDatabase, statementStr, -1, &stmt, NULL);
return stmt;
}
int step(sqlite3_stmt* stmt)
{
boost::mutex::scoped_ptr lock(myMutex);
return sqlite3_step(stmt);
}
boost::mutex myMutex;
}
Database mDatabase;
class Producer
{
public:
void produce(const char* statementStr){
sqlite3_stmt* stmt = mDatabase.prepare(statementStr);
// now push it onto the consumer's queue
}
}
class Consumer
{
void consume() {
mDatabase.step(statementQueue.pop());
}
}
我在准备语句中看到了竞争条件。我的问题是,我怎样才能充分保护我的代码以防止这种竞争条件?
更新 我从多个线程访问数据库的事实似乎是相关的。我在一个线程上填充我的数据结构,而进一步的处理(更新、插入和删除)来自一个处理线程。处理线程持有一个准备好的语句队列。