Да, вам, несомненно, нужны семафоры (или что-то подобное, например, событие или критическая секция) для защиты доступа к данным.
Моя непосредственная реакция - думать, прежде всего, о последовательности блоков, хотя, а не весь файл.Во-вторых, я почти никогда не использую семафор (или что-то подобное) напрямую.Вместо этого я обычно использовал бы потокобезопасную очередь, поэтому, когда сетевой поток прочитал блок, он помещает структуру в очередь, сообщающую, где находятся данные и тому подобное.Поток обработки ожидает элемент в очереди, а когда он прибывает, он выскакивает и обрабатывает этот блок.
Когда он заканчивает обработку блока, он обычно помещает результат в другую очередь для следующего этапа обработки (например, записи в файл) и (вполне возможно) помещает дескриптор для обработанного блокав другую очередь, так что память может быть повторно использована для чтения другого блока ввода.
По крайней мере, по моему опыту, этот тип дизайна устраняет большой процент проблем синхронизации потоков.
Редактировать: я не уверен насчет рекомендаций о том, как проектировать потокобезопасную очередь, но я разместил код для простого в предыдущем ответе .
Что касается шаблонов проектирования, я видел, что это называется, по крайней мере, "конвейером" и "производственной линией" (хотя я не уверен, что видел это в большой литературе).