我有一个受我自己锁定保护的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());
}
}
我在准备声明中看到了竞争条件。我的问题是,我如何充分保护我的代码以防止这种竞争条件?
更新 我从多个线程访问数据库的事实似乎是恰当的。我在一个线程上进行数据结构的填充,而进一步处理(更新,插入和删除)来自处理线程。处理线程拥有一个准备好的语句队列。