簡體   English   中英

C多線程-通過2個線程崩潰Sqlite3數據庫訪問

[英]C Multithreading - Sqlite3 database access by 2 threads crash

這是我的問題的描述:

我的程序中有2個線程。 一個是主線程,另一個是我使用pthread_create創建的線程

主線程在sqlite3數據庫上執行各種功能。 每個功能都會打開以執行所需的操作,並在完成后將其關閉。

另一個線程在設置的時間間隔后簡單地從數據庫讀取,並將其上載到服務器。 該線程還打開和關閉數據庫以執行其操作。

當兩個線程碰巧都打開數據庫時,會發生此問題。 如果第一個完成,它將關閉數據庫,從而導致另一個崩潰,使應用程序無法使用。 Main每次操作都需要數據庫。

有什么方法可以防止這種情況發生嗎? 互斥鎖是一種方法,但是如果我使用互斥鎖,它將使我的主線程無用。 主線程必須始終保持功能正常,而其他線程則在后台運行。

任何建議,使這項工作將是巨大的。 我沒有提供摘要,因為這個問題太大了,但是如果您對這個問題不了解,請告訴我。

編輯:

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個字段

讓您的線程各自使用自己的數據庫連接。 后台線程沒有理由影響主線程的連接。

通常,我想使用連接池,這樣我就不會非常頻繁地打開和關閉數據庫連接。 連接打開是一項昂貴的操作。

在應用服務器中,我們經常有很多線程,我們發現只有幾十個連接的連接池足以代表數百個用戶處理請求。

基本內置於sqlite3中的機制提供鎖定... BEGIN EXCLUSIVE然后您還可以注冊一個sleep回調,以便其他線程可以執行其他操作...

參見sqlite3_busy_handler()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM