独自のロックによって保護されている 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 つのスレッドで行い、その後の処理 (更新、挿入、削除) は処理スレッドから行われます。処理スレッドは、準備済みステートメントのキューを保持します。