2012-12-29 59 views
1

我有一个创建多个线程的程序,它们中的每一个都试图在不同位置(偏移量)的文件中写入100个字节。 第一个线程写入从0开始的100个字节,从100开始的第二个100个字节,从300开始的第三个100字节等等 如果线程按此顺序执行,则一直运行正常,我不需要fseek。但对于实时并发性,如果我将第一个线程“睡眠(2)”放置2秒,请等到所有其他线程完成,然后使用fseek将文件光标移到文件的开头,这种情况不会发生。 我使用互斥锁来处理并发。 代码示例:如何强制fseek()移动光标

offset=0;//for the first thread 
    char data[100]; 
    int length; // how many chars are currently in data 
    FILE * f; 

    pthread_mutex_lock(&mutexFileWrite); 
    f = fopen(fileName, "a"); 
    fseek(f,offset, SEEK_SET); 
    fwrite(data,sizeof(char),length,f); 
    fclose(f); 
    pthread_mutex_unlock(&mutexFileWrite); 

回答

4

不要打开追加模式的文件,如果你不只是追加到它的计划。

从为fopen POSIX的参考:

打开与追加模式文件(一个如在模式参数中的第一个字符)应使所有后续写入到该文件被强制到现行端文件,不管中间调用fseek()

看起来像你在寻找r+模式。

+0

问题解决了,非常感谢您的时间。 – NiCU