Аналог мьютекса для записи-чтения файла - страница 2

 
George Merts:

На мой взгляд, разумнее не писать метку в начало файла, а создавать и удалять файл-метку. Мастер - перед записью создает файл-метку, и начинает запись. Когда все посчитано и записано - файл-метка удаляется.

Слейвы - перед чтением - проверяют существование файл-метки, и считывают данные только в случае его отсутствия.

И ещё: каждый слейв должен сигналить о том, что завершил чтение. А мастер прежде, чем разрешать чтение, должен глянуть метки слейвов - вдруг кто-то ещё не закончил чтение.
 
А просто захватить файл на уникальное владение не?
 
George Merts:

На мой взгляд, разумнее не писать метку в начало файла, а создавать и удалять файл-метку. Мастер - перед записью создает файл-метку, и начинает запись. Когда все посчитано и записано - файл-метка удаляется.

Слейвы - перед чтением - проверяют существование файл-метки, и считывают данные только в случае его отсутствия.

У меня этот процесс происходит раз в секунду по таймеру. И что будет с фрагментацией винта? И чем это метод лучше, обоснуйте плз. К тому же писать байт в открытый файл куда быстрее, чем удалять создавать новый.
 
Artyom Trishkin:
И ещё: каждый слейв должен сигналить о том, что завершил чтение. А мастер прежде, чем разрешать чтение, должен глянуть метки слейвов - вдруг кто-то ещё не закончил чтение.
Этого не требуется. Алгоритм таков, что мастер не должен прерываться, он считает и пишет сигналы на открытие позиций. Если слейв что-то пропустит - ну не откроет позицию, не велика потеря.
 
Alexey Volchanskiy:
У меня этот процесс происходит раз в секунду по таймеру. И что будет с фрагментацией винта? И чем это метод лучше, обоснуйте плз. К тому же писать байт в открытый файл куда быстрее, чем удалять создавать новый.
Создайте виртуальный диск с помощью DAEMON Tools Ultra,я из 16гб выделил 1 как раз для такой операции.
 
Alexey Volchanskiy:
У меня этот процесс происходит раз в секунду по таймеру. И что будет с фрагментацией винта? И чем это метод лучше, обоснуйте плз. К тому же писать байт в открытый файл куда быстрее, чем удалять создавать новый.
Смысл в том, чтобы избежать лишних обращений для слейвов. Но, скажем, файл-метку можно не удалять, а просто изменять его длину. То обнулять, до что-то записывать. Сама длина - тоже может о чем-то предупреждать слейвов.
 
pusheax:
Создайте виртуальный диск с помощью ...
Вот мы и пришли к чему начинали. Для своих нужд можно и dll использовать. А виртуальный RAM диск пользователям маркета не поставишь. 
 
George Merts:
Смысл в том, чтобы избежать лишних обращений для слейвов. Но, скажем, файл-метку можно не удалять, а просто изменять его длину. То обнулять, до что-то записывать. Сама длина - тоже может о чем-то предупреждать слейвов.
Размер файла около 1 Кб, не вижу особой нагрузки для слейвов. Как тут позднее заметили RAM-диск для маркета не годится. Впрочем, у меня все отлично работает, тестирую с утра, нагрузка на проц сразу упала с 25% до 3-5% для 10 терминалов.
 
Alexey Volchanskiy:

Есть такая задача. На компе работают 10 терминалов, на каждом крутится один и тот же советник. Нет смысла всем 10 выполнять довольно тяжелые вычисления. Хочу сделать одного Master, остальные Slave's. Мастер делает расчеты и пишет инфу в общий файл, слейвы ее читают и далее отрабатывают "легкую" часть алгоритма.

И тут возникает проблема, а что, если мастер еще не все записал, а слейвы уже начали читать? В маркете нельзя использовать Win Api, так бы я мьютекс завел и проблема решена. Пока сделал так - Мастер перед записью данных взводит в самом начале файла флаг типа int, ждет какое-то время, пишет данные, потом флаг сбрасывает. Тоже криво и небезопасно, но лучше не придумал. Ну нет в MQL4/5 атомарных операций.

Кто чего посоветует/покритикует?


FILE_SHARE_READ совместный доступ по чтению со стороны нескольких программ
FILE_SHARE_WRITE совместный доступ по записи со стороны нескольких программ
 

а через видновские события подойдет метод ?

но нужно импортировать несколько функций из kernel32.dll

Если да то набросаю код.

Причина обращения: