0

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

我在准备语句中看到了竞争条件。我的问题是,我怎样才能充分保护我的代码以防止这种竞争条件?

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

4

0 回答 0