如何在准备声明中充分保护我的SqLite数据库免受竞争条件的影响?

时间:2013-06-14 21:35:03

标签: c++ boost sqlite

我有一个受我自己锁定保护的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());
    }
}

我在准备声明中看到了竞争条件。我的问题是,我如何充分保护我的代码以防止这种竞争条件?

更新 我从多个线程访问数据库的事实似乎是恰当的。我在一个线程上进行数据结构的填充,而进一步处理(更新,插入和删除)来自处理线程。处理线程拥有一个准备好的语句队列。

0 个答案:

没有答案