При открытии / создании файла запускается поток.Теперь сохраните этот идентификатор потока / ptr как дескриптор файла.
По сути, поток ничего не будет делать, кроме как сидеть в цикле в ожидании "события".Семафор был бы хорош здесь.Когда вы хотите выполнить чтение, вы добавляете команду чтения в очередь (не забудьте добавить в стек критическую секцию), возвращаете уникальный идентификатор, а затем увеличиваете семафор.Если поток спит, он теперь проснется и заберет первое сообщение из очереди и обработает его.Когда она завершится, вы удалите команду из очереди.
Чтобы узнать, завершено ли чтение файла, вы можете просто проверить, находится ли он в очереди команд.Если его там нет, то команда завершилась.
Кроме того, если вы хотите разрешить синхронное чтение, то после отправки сообщения вы можете подождать, пока "событие" не будет вызвано завершением.Затем вы проверяете, является ли уникальный идентификатор очередью, и если это не так, вы возвращаете управление.Если это так, то вы возвращаетесь в состояние ожидания, пока соответствующий уникальный идентификатор не будет обработан.