路之遥_其漫漫 2017-05-17 01:27 采纳率: 0%
浏览 3047

多线程写同一个文件, 数据内容出错

描述:

    * 1. 采用C语言, 多线程 对同一个文件进行写操作;
    * 2.每个线程有自己的写入位置;
    * 3.每个线程有自己的数据缓冲区;
    * 4.写文件前, 会 加锁(全局变量), 然后 将文件句柄 跳跃到指定位置, 写下线程缓冲区的数据;
    * 5.现象: 写的是图片, 经常出现写入数据出错, 图片打不开;
    * 6.日志: 对写文件前后的 文件句柄进行位置打印, 位置正确.
            (每个线程进行写文件的)代码实现:  各线程都会打开同一个文件获取句柄, 
    void write_file(FILE* fp, char *srcContent, int Lenth, int index)
    {

    int nwrite = 0, len = 0;
    pthread_mutex_lock(&g_muetx_lock);

    printf("---------- 1 -----------\n");

    if((fseek(fp, threadWorkHandle[index].writeInitPosition , SEEK_SET)) == -1)
    {
        myprint("Err : func lseek()");
        assert(0);
    }
    myprint("pthread : %d, The write begin current : %lu, fp : %p", index, ftell(fp), fp);

    while(nwrite < Lenth)
    {

        if((len = fwrite( srcContent + nwrite, 1, Lenth - nwrite, fp)) < 0)
        {       
            myprint("Err : func fwrite()");
            assert(0);
        }       
        nwrite += len;
    }
    threadWorkHandle[index].writeInitPosition  += Lenth;
    myprint("pthread : %d, The write end  : %lu, nwrite : %d", index, ftell(fp), nwrite);

    //fflush(fp);
    printf("---------- 2 -----------\n");

    pthread_mutex_unlock(&g_muetx_lock);

    }
  • 写回答

6条回答

  • oyljerry 2017-05-17 01:55
    关注

    文件打开是否为共享写的方式,其实对于一个文件,没必要多个线程去写,一个线程写就可以了

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题