0

ここに私の問題の説明があります:

私のプログラムには2つのスレッドがあります。1 つはメイン スレッドで、もう 1 つはpthread_createを使用して作成したものです。

メイン スレッドは、 sqlite3 データベースでさまざまな機能を実行します。各機能を開いて必要なアクションを実行し、完了したら閉じます。

もう一方のスレッドは、設定された時間間隔の後にデータベースから読み取り、サーバーにアップロードします。また、スレッドはデータベースを開いたり閉じたりして、その操作を実行します。

この問題は、両方のスレッドがたまたまデータベースを開いている場合に発生します。一方が先に終了すると、データベースが閉じられ、他方がクラッシュしてアプリケーションが使用できなくなります。Main では、操作ごとにデータベースが必要です。

これを防ぐ方法はありますか?Mutex は 1 つの方法ですが、mutex を使用すると、メイン スレッドが役に立たなくなります。メイン スレッドは常に機能している必要があり、他のスレッドはバックグラウンドで実行されます。

この作業を行うためのアドバイスは素晴らしいでしょう。この問題は少し広すぎるのでスニペットを提供しませんでしたが、問題について何も理解していない場合はお知らせください.

編集:

static sqlite3 *db = NULL;

データベースを開くためのコード スニペット

int open_database(char* DB_dir) // argument is the db path
        rc = sqlite3_open(DB_dir , &db); 

        if( rc )                
        {
//failed to open message
            sqlite3_close(db); 
            db = NULL;
            return SDK_SQL_ERR;
        }
        else
        {
            //success message
        }
    }
    return SDK_OK;

}

そしてdbを閉じる

int close_database()
{
    if(db!=NULL)
    {
        sqlite3_close(db);
        db = NULL;
        //success message
    }
    return 1;
}

編集: バックグラウンド スレッドは、サーバーにアップロードする行ごとにテーブルの 1 つのフィールドを更新する単一の書き込み操作を実行することを追加するのを忘れていました

4

2 に答える 2

0

基本的にsqlite3にはロックを提供するメカニズムが組み込まれています...BEGIN EXCLUSIVEそして、スリープコールバックを登録して、他のスレッドが他のことを実行できるようにすることもできます...

sqlite3_busy_handler()を参照してください

于 2014-08-18T14:01:23.847 に答える