- 论坛徽章:
- 0
|
想实现一个程序。多线程处理文件。每次处理完成用db4保存文件的偏移量。一直不成功。哪位大虾能不能给个多线程模式下访问db4的例子啊
#include <stdio.h>
#include <pthread.h>
#include <db.h>
void *readfile(void *arg);
char *dbfile = "fileoffset.db";
DB_ENV *dbenv;
int main(int argc, char *argv[])
{
pthread_t tid1,tid2;
int ret;
ret = db_env_create(&dbenv,0);
dbenv->set_errfile(dbenv, stderr);
dbenv->open(dbenv,"/tmp/dbhome",DB_INIT_CDB|DB_INIT_MPOOL|DB_CREATE,644);
if (pthread_create(&tid1,NULL,readfile,(void *)"inventory1.txt")!=0)
{
fprintf(stderr,"create tid1 error\n");
}
if (pthread_create(&tid2,NULL,readfile,(void *)"inventory2.txt")!=0)
{
fprintf(stderr,"create tid2 error\n");
}
pthread_join(tid1,NULL);
pthread_join(tid1,NULL);
//readfile("inventory1.txt");
if (dbenv != NULL)
{
dbenv->close(dbenv,0);
}
return 0;
}
void *readfile(void *arg){
DB *dbp;
u_int32_t open_flag;
char *filename = (char *)arg;
FILE *infp;
long int offset;
char buf[1024];
DBT key,value;
int ret;
int count=0;
//open db
ret = db_create(&dbp,dbenv,0);
if (ret != 0)
{
fprintf(stderr,"access_db_thread : %s\n",db_strerror(ret));
}
open_flag = DB_CREATE;
ret = dbp->open(dbp,
NULL,
dbfile,
NULL,
DB_BTREE,
open_flag,
0);
if (ret != 0)
{
dbp->err(dbp,ret,"database %s open error\n",dbfile);
return (void *)ret;
}
//打开文件
infp = fopen(filename,"r");
if (infp == NULL)
{
fprintf(stderr,"open %s error\n",filename);
return (void *)-1;
}
memset(&key,0,sizeof(DBT));
memset(&value,0,sizeof(DBT));
key.ulen = strlen(filename)+1;
key.data = filename;
key.flags = DB_DBT_USERMEM;
value.size=sizeof(long int);
ret = dbp->get(dbp,NULL,&key,&value,0);
if (ret != 0)
{
offset = 0;
dbp->err(dbp,ret,"get key %s from database error\n",filename);
sleep(2);
}else
offset = *(long int *)(value.data);
fprintf(stdout,"###########%s 's offset: %ld\n",filename,offset);
fseek(infp,offset,SEEK_SET);
while (!feof(infp))
{
fgets(buf,1024,infp);
fprintf(stderr,"offset:%ld content:%s\n",offset,buf);
offset = ftell(infp);
value.size = sizeof(long int);
value.data = &offset;
ret = dbp->put(dbp,NULL,&key,&value,0);
if (ret != 0 )
{
dbp->err(dbp,ret,"put data to database error\n");
sleep(2);
}
dbp->sync(dbp,0);
}
dbp->close(dbp,0);
}
目前的操作。我是想在程序启动时创建 DB_ENV,在子线程里基于环境打开数据表。执行读/写(记录文件偏移量)操作。程序结束时关闭环境。不知道这在多线程环境里是否正确。
另外我在环境变量打开时增加一个DB_THREAD后不能记录偏移量
dbenv->open(dbenv,"/tmp/dbhome",DB_INIT_CDB|DB_INIT_MPOOL|DB_CREATE|DB_THREAD,644); |
|