Совместная запись в файл

Обсуждение программ nnCron и nnCron LITE

Совместная запись в файл

Postby mihast » Sun, 16 Aug 2015, 07:20

Есть несколько задач, запускаемых через nncron -runfile Они должны писать в один общий лог.

Не может ли случиться так, что при одновременной записи из двух потоков одна из записей "потеряется" ? Есть ли разница, в плане поддержки записи из разных потоков, между LOG и FAPPEND ?
mihast
 
Posts: 51
Joined: Tue, 23 Aug 2005, 21:14

Re: Совместная запись в файл

Postby VoidVolker » Sun, 16 Aug 2015, 10:55

Нет, не потеряется. Такие случаи обрабатываются на уровне ОС. Но лучше всего будет сделать один отдельный поток для записи лога на диск из глобальной очереди, а другие потоки пусть пишут в эту очередь свои данные.
FAPPEND открывет файл через слово OPEN/CREATE-FILE - так что пока одна запись идет другая ждет своей очереди.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Совместная запись в файл

Postby mihast » Sun, 16 Aug 2015, 11:00

А как сделать эту "глобальную очередь" для независимых (nncron -runfile) потоков кроме как через файлы ?

Может быть на уровне ОС есть возможность использования Глобальных Семафоров ? Не подскажете как ?
mihast
 
Posts: 51
Joined: Tue, 23 Aug 2005, 21:14

Re: Совместная запись в файл

Postby VoidVolker » Sun, 16 Aug 2015, 11:24

В целом алгоритм выглядит так:
  • Создать глобальный буфер памяти
  • Создать глобальную переменную для хранения числа элементов
  • Написать слова для асинхронного добавления элементов (семафоры и т.п.) в буфер
  • Написать слова для синхронного чтения с другого конца буфера и смещения его элементов.
Наиболее простым решением видится сделать через списки - там есть возможность добавлять/удалять элементы как в начале так и в конце списка.
На вскидку, что-то типа такого:
Code: Select all
VARIABLE queueSem

GLOBAL-STRING-LIST: queue
: queueAdd    \ ( a u -- )
    queueSem GET
    queue!
    queueSem RELEASE
;

: queueLog
    queueSem GET
    queue# IFNOT
        queue(
            NODE@ S" C:\log.log" FAPPEND
        )queue
        queue LIST-FREE
    THEN
    queueSem RELEASE
;
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Совместная запись в файл

Postby mihast » Sun, 16 Aug 2015, 11:46

А этот GLOBAL-STRING-LIST и вообще GLOBAL-ALLOCATE действительно будут видны всем Экземплярам nnCron-а запущенным по nncron -runfile ? Главное, чтобы у них каталог запуска был один ? Или даже это не обязательно ?

Неужели семафоры (GET RELEASE) разделяются между всеми потоками запущенным по nncron -runfile ?
А как они тогда идентифицируются: по nnCron имени ? Тогда эти имена должны быть уникальными в системе ?
mihast
 
Posts: 51
Joined: Tue, 23 Aug 2005, 21:14

Re: Совместная запись в файл

Postby VoidVolker » Sun, 16 Aug 2015, 12:05

mihast wrote:А этот GLOBAL-STRING-LIST и вообще GLOBAL-ALLOCATE действительно будут видны всем Экземплярам nnCron-а запущенным по nncron -runfile ?

Да, конечно, это ведь глобальное выделение памяти для всего процесса и все дочерние потоки имеют к ней полный доступ. От каталога это не зависит, т.к. каталог - это элемент файловой системы, а оперативная память - это физически другое устройство.
mihast wrote:семафоры (GET RELEASE) разделяются между всеми потоками запущенным

Конечно же, ведь VARIABLE создает глобальные переменные.
mihast wrote:А как они тогда идентифицируются: по nnCron имени ? Тогда эти имена должны быть уникальными в системе ?

Да, конечно, любые глобальные именованные объекты должны иметь уникальное имя - сюда входят все слова, в т.ч. названия задач, словари, слова, переменные, массивы и все прочее. Собственно, это все тоже слова, ведь в форте есть только одно определение - это слово.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests