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());
    }
}

準備ステートメント内で競合状態が発生しています。私の質問は、このような競合状態を防ぐためにコードを適切に保護するにはどうすればよいですか?

更新 複数のスレッドからデータベースにアクセスするという事実は適切なようです。データ構造の作成は 1 つのスレッドで行い、その後の処理 (更新、挿入、削除) は処理スレッドから行われます。処理スレッドは、準備済みステートメントのキューを保持します。

4

0 に答える 0