免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1340 | 回复: 0
打印 上一主题 下一主题

c多线程访问db4问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-10 18:20 |只看该作者 |倒序浏览
想实现一个程序。多线程处理文件。每次处理完成用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);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP