1

複数のスレッドを作成するプログラムがあり、それぞれが異なる場所 (オフセット) のファイルに 100 バイトを書き込もうとします。最初のスレッドは 0 から始まる 100 バイト、2 番目のスレッドは 100 から始まる 100 バイト、3 番目のスレッドは 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);
4

1 に答える 1

4

追加のみを計画していない場合は、ファイルを追加モードで開かないでください。

のPOSIXリファレンスからfopen

追加モード (モード引数の最初の文字として a) でファイルを開くと、 fseek() への介在呼び出しに関係なく、ファイルへの後続のすべての書き込みは、その時点で現在のファイルの終わりに強制されます。

r+モードを探しているようです。

于 2012-12-29T11:46:06.170 に答える