首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Berkeley DB,多线程致命错误

Berkeley DB,多线程致命错误
EN

Stack Overflow用户
提问于 2011-04-24 15:18:03
回答 1查看 845关注 0票数 0

我编写了一个在C/C++中使用伯克利数据库的程序,就像混合程序一样。我有一个名为bdb的类。

代码语言:javascript
复制
    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;
 };

接下来,在程序中,我将使用如下方法

代码语言:javascript
复制
 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,也许是在同一时间。

结果是每次我在节目开始后

代码语言:javascript
复制
PANIC: fatal region error detected; run recovery
PANIC: fatal region error detected; run recovery

我在线路上发现了一个分割错误

代码语言:javascript
复制
ret = cursorp->c_get(cursorp, &key,&data, DB_PREV);

我也不知道原因?

EN

回答 1

Stack Overflow用户

发布于 2011-04-25 23:05:52

您可能需要考虑在OTN上将您的问题发布到伯克利DB论坛上。有一个活跃的应用程序开发人员、支持工程师和BDB开发人员社区,他们在该论坛上进行交互。

以下是几种快速的可能性:

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

以下文档可能是有用的:第四章 of C++入门指南,C++入门指南中的示例,参考GuideY中的程序员备注章节。

如果这不能解决您的问题,我鼓励您张贴到上述伯克利DB论坛。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5771363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档