Berkeley DB,Multithreaded FATAL ERROR

时间:2011-04-24 15:18:04

标签: c++ c berkeley-db

我编写了一个在C / C ++中使用Berkeley DB的程序。 我用这个方法有一个名为bdb的类。

    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;
}

因此,对象是创建的对象,而不是将地址赋予多个线程。 他们都可以在同一时间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);

我不知道为什么?

1 个答案:

答案 0 :(得分:0)

您可能需要考虑将问题发布到OTN上的Berkeley DB Forum。在该论坛上有一个活跃的应用程序开发人员,支持工程师和BDB开发人员社区。

以下是一些快速的可能性:

  • 您的应用程序是否可能在每个线程中调用dbenv-> open()?这往往会产生你描述的症状。您只想在应用程序开始时调用dbenv->打开一次。
  • 打开数据库句柄时需要指定DB_THREAD。

以下文档可能有用:“C ++入门指南”的Chapter 4,“C ++入门指南”中的Example,参考指南中的Programmer Notes章节。

如果这不能解决您的问题,我建议您发布到上面列出的Berkeley DB论坛。