[英]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回調,以便其他線程可以執行其他操作...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.