ファイルに書き込むスレッドと、同じファイルから読み取るスレッドの 2 つのスレッドがあります。ライター スレッドでは CreateFile と WriteFile、FlushFileBuffers を使用し、リーダー スレッドでは FtpPutFile を使用します。
ここで単純な windows32 Mutex を実装するにはどうすればよいですか? (何年も使ってない)
または、これは CreateFile に送信される適切なフラグで可能ですか? (やってみたけどダメだった)
ファイルに書き込むスレッドと、同じファイルから読み取るスレッドの 2 つのスレッドがあります。ライター スレッドでは CreateFile と WriteFile、FlushFileBuffers を使用し、リーダー スレッドでは FtpPutFile を使用します。
ここで単純な windows32 Mutex を実装するにはどうすればよいですか? (何年も使ってない)
または、これは CreateFile に送信される適切なフラグで可能ですか? (やってみたけどダメだった)
ミューテックスは必要ありません。複数のスレッドで同じファイルを安全に読み書きできます。ファイルを複数回開いて、各スレッドが独自のファイル ハンドルと独自のファイル ポインターを持つようにしたり、重複した I/O を使用して特定の位置で読み取りまたは書き込みを行うことができます。
オーバーラップ I/O のためにファイルを開く必要はありません。これを行うことができます:
LARGE_INTEGER off = offset;
OVERLAPPED ov = { 0 };
ov.Offset = off.LowPart;
ov.OffsetHigh = off.HighPart;
ReadFile(handle, buffer, count, &bytesRead, &ov);
これにより、ファイル ( offset
) 内の特定の位置をアトミックに読み取ることができるため、SetFilePointerEx
別のスレッドがポインターを台無しにすることを呼び出して心配する必要がなくなります。同じことが書き込みにも機能します。
単純なミューテックスの実装方法: CreateMutex関数またはCreateMutexEx
を使用してミューテックスを作成します。完了したら、CloseHandleを呼び出す必要があります。ミューテックスを取得したら、 WaitForSingleObjectを呼び出して呼び出しを同期できます (完了したらReleaseMutexを呼び出すことを忘れないでください。最後に、Mutex オブジェクトの使用例を次に示します。