Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков

Страницы: 1
RSS
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Предположим, что в скрипте заведена таблица t. В потоке коллбэков в функции OnAllTrade() в таблицу t вставляются элементы. Пусть ключом будет цена, а значением -- номер сделки. В потоке main из этой таблицы происходит чтение данных по ключу. Поскольку потоки работают параллельно, то не исключена, например, такая ситуация.

1) В потоке коллбэка в таблицу вставляется новый элемент, что приводит к необходимости перестройки внутренней структуры таблицы t (не знаю, как реализована таблица внутри Lua, но по аналогии c реализацией хэш-таблиц в Java допускаю, что иногда при вставках приходится существенно поменять внутренности объекта).

2) Процесс внутренней перестройки таблицы ещё не закончен, её внутреннее состояние неконсистентно, а в параллельном потоке main() начинается чтение из таблицы t по какому-то ключу.

Вопросы:

а) Есть ли гарантия, что из таблицы будет корректно прочитан элемент (возможно, nil), а не произойдёт какая-то ошибка?

б) А если в п.1 элементы удаляются из таблицы?

Спрашиваю потому, что одно дело обеспечить целостность примитивных данных, другое дело -- объектов со сложной внутренней структурой. Разработчики QLua не зря добавили специальные "Потокобезопасные функции для работы с таблицами Lua". Если добавление/удаление данных из lua-таблиц в самой lua-машине реализовано потокобезопасно, то это положительно отвечает на вопросы а) и б). Если нет -- тогда беда.
 
Да, проблема существует.

http://www.bot4sale.ru/blog-menu/qlua/spisok-statej/455-queue.html

или table.sinsert   table.sremove
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Я понимаю, почему функции table.sinsert и table.sremove введены в QLua: надо не только вставить/удалить один элемент, но ещё и сдвинуть остальные элементы таблицы по номерам.

Как написано выше по ссылке, я сам так делаю при передаче данных из коллбэков в main. Вопрос был про одиночное добавление/удаление элементов в таблицу без сдвига всех остальных. По идее, он должен работать, иначе будет рушиться даже этот алгоритм.
 
Действия типа

a={}
a.xxx = 1
a.yyy = 2
a.xxx = nil

и подобные безопасны
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Спасибо, можно считать, что тема закрыта.
Страницы: 1
Читают тему
Наверх