0
我寫了一個程序,使用C/C++中的Berkeley DB就像混合使用。 我有一個類與這種方法稱爲bdb。Berkeley DB,Multithreaded致命錯誤
int open(char *db_name)
{
flags = DB_CREATE;
u_int32_t envCreateFlags = DB_CREATE |
DB_INIT_LOCK|
DB_INIT_LOG|
DB_INIT_MPOOL|
DB_INIT_TXN|
DB_RECOVER |
DB_THREAD;
ret = db_env_create(&dbenv, 0);
dbenv->err(dbenv,ret,"err db_env_create ");
ret = dbenv->open(dbenv,"./",envCreateFlags,0);
dbenv->err(dbenv,ret,"err db_env_open ");
ret = db_create(&dbp,dbenv, 0);
dbp->err(dbp,ret,"err db_create ");
ret = dbp->open(dbp, /* DB structure pointer */
NULL, /* Transaction pointer */
db_name, /* On-disk file that holds the database. */
NULL, /* Optional logical database name */
DB_BTREE, /* Database access method */
flags, /* Open flags */
0); /* File mode (using defaults) */
dbp->err(dbp,ret,"err dbp open ");
return ret;
};
所以在接下來的計劃,我會使用像
int getEntry(char *url ,unsigned int *fp)
{
DBT key, data;
DBC *cursorp;
dbp->cursor(dbp, NULL, &cursorp, 0);
memset(&key, 0, sizeof(DBT));
memset(&data, 0, sizeof(DBT));
key.data = fp;
key.ulen = sizeof(unsigned int);
key.flags = DB_DBT_USERMEM;
data.data = url;
data.ulen = sizeof(char) * maxUrlSize;
data.flags = DB_DBT_USERMEM;
ret = cursorp->c_get(cursorp, &key,&data, DB_PREV);
if (cursorp != NULL)
cursorp->close(cursorp);
if (ret == DB_NOTFOUND)
return -1;
}
因此,在創建對象的人,比ADRESS的方法是考慮到多線程。 他們都以getEntry和checkUpdate也許在同一時間..
的結果是每一個程序
PANIC: fatal region error detected; run recovery
PANIC: fatal region error detected; run recovery
開始後,我得到的時間和我上線分段故障
ret = cursorp->c_get(cursorp, &key,&data, DB_PREV);
我不知道爲什麼?
你可以在調試器中運行你的程序來查看它實際失敗的位置嗎?也可以嘗試將代碼燒開來做一個簡短的例子嗎? – 2011-04-24 15:28:21
當然,你不知道如何在不丟失信息的情況下縮短代碼: - /希望它的oki – Roby 2011-04-24 15:34:42