我编写了一个在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);
我不知道为什么?
答案 0 :(得分:0)
您可能需要考虑将问题发布到OTN上的Berkeley DB Forum。在该论坛上有一个活跃的应用程序开发人员,支持工程师和BDB开发人员社区。
以下是一些快速的可能性:
以下文档可能有用:“C ++入门指南”的Chapter 4,“C ++入门指南”中的Example,参考指南中的Programmer Notes章节。
如果这不能解决您的问题,我建议您发布到上面列出的Berkeley DB论坛。