2011-04-24 98 views
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); 

我不知道爲什麼?

+0

你可以在調試器中運行你的程序來查看它實際失敗的位置嗎?也可以嘗試將代碼燒開來做一個簡短的例子嗎? – 2011-04-24 15:28:21

+0

當然,你不知道如何在不丟失信息的情況下縮短代碼: - /希望它的oki – Roby 2011-04-24 15:34:42

回答

0

您可能需要考慮將您的問題發佈到OTN上的Berkeley DB Forum。有一個活躍的應用程序開發人員社區,支持工程師和BDB開發人員在該論壇上進行交互。

這裏有一對夫婦的快速可能性:在每一個線程

  • 有沒有可能是您的應用程序調用dbenv-> open()的?這往往會產生你描述的症狀。你只想在你的應用程序開始時調用dbenv-> open。
  • 當您打開數據庫句柄時,您需要指定DB_THREAD。

以下文檔可能是有用的:在C++入門指南,在C++中的ExampleChapter 4入門指南,在參考GuideY的Programmer Notes章。

如果這不能解決您的問題,我建議您發佈到上面列出的Berkeley DB論壇。