【问题标题】:Berkeley DB, Multithreaded FATAL ERRORBerkeley DB,多线程致命错误
【发布时间】:2011-04-24 15:18:03
【问题描述】:

我编写了一个程序,它在 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);

不知道为什么?

【问题讨论】:

  • 您能否在调试器中运行您的程序以查看它实际失败的地方,并尝试将代码简化为一个更短的示例?
  • 当然,你不知道如何在不丢失信息的情况下缩短代码... :-/希望它没问题

标签: c++ c berkeley-db


【解决方案1】:

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

这里有几个快速的可能性:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多