我有一个创建多个线程的程序,每个线程都尝试在不同位置(偏移量)的文件中写入100个字节。 第一个线程从0开始写入100个字节,从100开始写入第二个100个字节,从300开始写入第三个100个字节,依此类推 如果线程按此顺序执行,那么就可以了,我不需要fseek。但是对于实时并发,如果我将第一个线程置于“sleep(2)”2秒钟,等待所有其他线程完成,并使用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);
答案 0 :(得分:4)
如果您不打算仅附加到文件,请不要以追加模式打开文件。
来自fopen
的POSIX参考:
打开带有追加模式的文件(作为mode参数中的第一个字符)将导致对文件的所有后续写入被强制转移到当前的文件结尾,无论对fseek的中间调用如何()强>
看起来您正在寻找r+
模式。