<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Потокобезопасные функции в Lua 5.3]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Потокобезопасные функции в Lua 5.3 форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Mon, 11 May 2026 00:47:03 +0300</pubDate>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message48280/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_7UIir855" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br /> По-любому все потоки в квике, привязанные к луа, будут шарить одну луа-машину и, таким образом, выполняться по очереди. Поэтому я не понимаю цели подобных изысканий. Ну, создали еще 100 потоков, получили 100 дополнительных переключений контекста, поймали и героически преодолели кучку косяков с синхронизацией. И в чем профит? Кроме, конечно, прокачивания скилла, тоже занятие не сказать чтобы вредное, если есть куда потом этот скилл продать.<br />=============<br />По-моему Вы ошибаетесь.<br />VMLua (луа машин) &nbsp;не одна, а одна+число скриптов.<br />Одна - в основном потоке, где будут последовательно вызываться все колбеки QLUA<br />и еще по одной на каждый скрипт (main - создает свою VMLua)<br />------------------------------- <br />В итоге колбеки QLUA вызываются в очередь, а потоки main могут работать параллельно.<br />Поэтому, если мы делаем копию получаемых данных, то их обработка может выполнятся параллельно.<br />------------------ &nbsp;<br />Но в отличии от запуска независимых задач, нет надобности перебрасывать все данные во все параллельные задачи. <br />В том то и суть параллельных потоков.<br />Если мы строит робота, который работает со множеством инструментов, то запуск отдельного скрипта (main) на каждый инструмент, позволяет нам организовать параллельную работу с инструментами.<br />При этом большинство модулей будет универсальными и будут запущены в единственном экземпляре.<br />-----------------<br />В существующем варианте QLUA &nbsp;в каждом скрипте для различных инструментов надо повторять все колбеки QLUA . <br />В итоге мы получаем многократный вызов одних и тех же колбеков в различных скриптах.<br />---------------- &nbsp;<br />В моем варианте для 1000 инструментов будет один модуль обработки например ТТП<br />А в существующей версии QOUA &nbsp;таких вызовов будет 1000 на каждое изменение ТТП &nbsp;и все они будут вызываться последовательно.<br />В итоге получается ужас какой-то. <br />
			<i>13.09.2020 07:13:36, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message48280/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message48280/topic5747/</guid>
			<pubDate>Sun, 13 Sep 2020 07:13:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message48279/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Z67m6MBP" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />На мой взгляд, тут исправлять ничего не нужно, кроме известных косяков. Свет клином не сошелся на qlua, его возможностей достаточно, чтобы вытащить нужные данные и ввести заявки, а все остальное можно делать снаружи, не загоняясь конкретной реализацией луа в квике, привычным, хорошо натренированным способом для конкретного исполнителя. Либо, если надо модифицировать поведение самого квика (что уже подразумевает некоторую хачность решения и привязку к версии), qlua дает официальный способ затащить в процесс длл и даже получать некоторые полезные уведомления. Если не пытаться строить космический корабль из запорожца, то все нормально. Опять же это то же самое создание изолированных задач, и это хорошая архитектура, если, конечно, нет желания переписывать все и вся под каждую новую версию квика.<br />=============<br />очевидные, почти аксиоматичные вещи, но реальность такова, что начитанные не всегда или очень не сразу становятся разумными<br />се ля ви<br />пс: хотя конечно без дурачков типа бурхановича было бы не так весело <br />
			<i>13.09.2020 07:06:50, новичок.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message48279/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message48279/topic5747/</guid>
			<pubDate>Sun, 13 Sep 2020 07:06:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message48274/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_LKr8fSEK" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />если не доказано как это исправить<br />=============<br />На мой взгляд, тут исправлять ничего не нужно, кроме известных косяков. Свет клином не сошелся на qlua, его возможностей достаточно, чтобы вытащить нужные данные и ввести заявки, а все остальное можно делать снаружи, не загоняясь конкретной реализацией луа в квике, привычным, хорошо натренированным способом для конкретного исполнителя. Либо, если надо модифицировать поведение самого квика (что уже подразумевает некоторую хачность решения и привязку к версии), qlua дает официальный способ затащить в процесс длл и даже получать некоторые полезные уведомления. Если не пытаться строить космический корабль из запорожца, то все нормально. Опять же это то же самое создание изолированных задач, и это хорошая архитектура, если, конечно, нет желания переписывать все и вся под каждую новую версию квика.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_lukY8VbG" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Я достаточно подробно изучал &nbsp;исходники луа, &nbsp;что решить проблему много поточности в своих приложениях и ускорения обмена данными из луа в си.<br />=============<br />По-любому все потоки в квике, привязанные к луа, будут шарить одну луа-машину и, таким образом, выполняться по очереди. Поэтому я не понимаю цели подобных изысканий. Ну, создали еще 100 потоков, получили 100 дополнительных переключений контекста, поймали и героически преодолели кучку косяков с синхронизацией. И в чем профит? Кроме, конечно, прокачивания скилла, тоже занятие не сказать чтобы вредное, если есть куда потом этот скилл продать. <br />
			<i>12.09.2020 09:49:09, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message48274/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message48274/topic5747/</guid>
			<pubDate>Sat, 12 Sep 2020 09:49:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message48272/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_PL8GOovS" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />Дискуссия схоластическая<br />=============<br /> Есть такое.<br /><br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />Проблема многопоточности и проблема синхронизации потоков - это синонимы.<br />=============<br /> Да, так. Надо пойти дальше и спросить, а в чем проблема синхронизации потоков. Она в синхронизации доступа к данным и только. У каждого потока есть свой (нативный) стек, поток также может выделить tls из кучи, и если он никуда больше не ходит, ему никакая синхронизация не требуется. Как только появляется какое-то разделяемое между потоками состояние, возникает проблема синхронизации доступа к нему. Посмотрим на примере. Берем два потока, совместно использующих один int. Если потоки лезут в этот int без синхронизации, имеем проблемы (даже int с точки зрения процессора не атомарен, атомарно можно его прочитать, но модифицировать уже нет). Защищаем int критической секцией. Все, проблем нет. Но если у нас два разделяемых int&#39;а, появляется выбор: одна общая критическая секция на все разделяемое состояние или у каждого поля своя. Второй вариант это отличный способ огрести проблем: во-первых, появляется возможность дедлока, во-вторых, появляется проблема атомарности изменения обоих полей сразу. То есть лучше выбрать вариант раз с одной критической секцией на все разделяемое состояние, ценой более длительных блокировок &nbsp;всех &nbsp;потоков. В луа самом по себе вариант раз и использован, но есть нюансы*. А в квике получился вариант два, результаты которого в основном и вылезают то тут то там. Внутри квика это еще можно разрулить, зная, что и в каком порядке лочить, но как только к этой запутанной системе дан доступ внешнему кодеру через луа, открыт ящик пандоры, кодер завсегда придумает, как упорядочить свои обращения к состоянию так, чтобы повесить весь квик или получить неконсистентные результаты. Автор топика не раз просил арку дать возможность синхронизации из луа, но это, увы, не решит проблему, в квике нет одного общего лока на все, а &nbsp;еще один лок &nbsp;сделает только хуже.<br /><br />Радикальный способ решения проблем - как раз приведенный в статье, межпоточное взаимодействие, по определению требующее синхронизации, локализуется в виде очередей сообщений, а каждый поток работает только со своим состоянием и ему никакая дополнительная синхронизация не нужна в принципе. Это еще не процессы (луа-то общий и нативный процесс тоже общий, хоть авторы и выбрали путающую терминологию), это просто собрали всю синхронизацию в одном месте и избавили конечного кодера от размышлений о ней. Как конкретно решили мне не нравится, но путь правильный.<br /><br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />Проблемы такого решения хорошо известны.<br />=============<br /> Можно ссылок или ключевиков? Винда как-то работает на сообщениях и ничего страшного, даже порт завершения позже придумали, то есть вперли-таки сообщения в само ядро (и молодцы).<br /><br /><br />* Если посмотреть в сорцы луа, увидим прекрасную вещь: сам по себе интерпретатор всегда работает под локом ( <noindex><a href="https://www.lua.org/source/5.3/lvm.c.html#luaV_execute" target="_blank" rel="nofollow">пруф: поищите lua_lock /lua_unlock в этой функции</a></noindex> ). То есть, если выполняется только луа-код без вызовов функций, он весь атомарен (и другие потоки ждут). Лок снимается только перед вызовом си-функции. При этом встроенные библиотеки луа тоже состоят из си-функций, поэтому лок может быть снят (и тут же захвачен снова библиотечной функцией) в непредсказуемых местах, что убивает-таки атомарность изменения состояния как целого даже в луа без квика, при этом средств синхронизации со стороны луа не предоставлено. То есть луа защищает консистентность своего состояния, но не консистентность состояния пользовательского кода, с точки зрения луа-кодера он в той же ситуации, в какой и без луа, вот тебе потоки и рули как хочешь. Поэтому и говорю, что проблема не луа-специфичная, проблема в ожиданиях от луа чего-то, чего он не дает, хоть в нем и есть lua_lock.<br />=============<br />Возможно ваши рассуждения правильны, возможно нет. <br />Но это не имеет значение, так как решения проблемы нет, кроме как указанная вами ссылка - т е созданием изолированных задач.<br /><br />Я достаточно подробно изучал &nbsp;исходники луа, &nbsp;что решить проблему много поточности в своих приложениях и ускорения обмена данными из луа в си.<br /> кое что получилось, не утверждаю, что все.<br /><br />Можно много рассуждать и строить правдоподобные гипотезы о том &nbsp;, почему что-то не работает. <br />но это лишь трата времени на переливание из пустого в порожнее, если не доказано как это исправить. <br />
			<i>12.09.2020 08:58:41, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message48272/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message48272/topic5747/</guid>
			<pubDate>Sat, 12 Sep 2020 08:58:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message48271/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Yia0mcYm" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />А у вас студия открывает дамп, созданный диспетчером задач?<br />=============<br />Да, открывает. <br />
			<i>12.09.2020 05:14:19, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message48271/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message48271/topic5747/</guid>
			<pubDate>Sat, 12 Sep 2020 05:14:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message48262/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			А у вас студия открывает дамп, созданный диспетчером задач? <br />
			<i>11.09.2020 15:14:39, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message48262/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message48262/topic5747/</guid>
			<pubDate>Fri, 11 Sep 2020 15:14:39 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message48260/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_xO16WilY" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br />Где вы это смотрите?<br />=============<br />Дамп загружается в вижл студию и запускается на отладку, будет показан колстек, а дальше сопоставляем дизасм с сорцами луа и вычисляем, где какая функция. Достаточно просто с некоторым навыком. Были б символы от квика, было б вообще просто, да кто ж их даст ) <br />
			<i>11.09.2020 14:39:59, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message48260/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message48260/topic5747/</guid>
			<pubDate>Fri, 11 Sep 2020 14:39:59 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message48249/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_6xVo29iv" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br />Падает на lua_getglobal. В qlua.dll основным потоком квика вызывается некая функция, она пытается вызвать lua_getglobal(state, "OnAllTrade") и, если успешно, далее заполняет табличку all_trade и вызывает полученную луа-функцию. То есть это как раз место, где вызывается OnAllTrade.<br />=============<br />Где вы это смотрите? <br />
			<i>11.09.2020 11:30:01, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message48249/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message48249/topic5747/</guid>
			<pubDate>Fri, 11 Sep 2020 11:30:01 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message48009/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_ALN0zghi" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Дискуссия схоластическая<br />=============<br />Есть такое.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_SFAYI21I" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Проблема многопоточности и проблема синхронизации потоков - это синонимы.<br />=============<br />Да, так. Надо пойти дальше и спросить, а в чем проблема синхронизации потоков. Она в синхронизации доступа к данным и только. У каждого потока есть свой (нативный) стек, поток также может выделить tls из кучи, и если он никуда больше не ходит, ему никакая синхронизация не требуется. Как только появляется какое-то разделяемое между потоками состояние, возникает проблема синхронизации доступа к нему. Посмотрим на примере. Берем два потока, совместно использующих один int. Если потоки лезут в этот int без синхронизации, имеем проблемы (даже int с точки зрения процессора не атомарен, атомарно можно его прочитать, но модифицировать уже нет). Защищаем int критической секцией. Все, проблем нет. Но если у нас два разделяемых int&#39;а, появляется выбор: одна общая критическая секция на все разделяемое состояние или у каждого поля своя. Второй вариант это отличный способ огрести проблем: во-первых, появляется возможность дедлока, во-вторых, появляется проблема атомарности изменения обоих полей сразу. То есть лучше выбрать вариант раз с одной критической секцией на все разделяемое состояние, ценой более длительных блокировок <I>всех</I> потоков. В луа самом по себе вариант раз и использован, но есть нюансы*. А в квике получился вариант два, результаты которого в основном и вылезают то тут то там. Внутри квика это еще можно разрулить, зная, что и в каком порядке лочить, но как только к этой запутанной системе дан доступ внешнему кодеру через луа, открыт ящик пандоры, кодер завсегда придумает, как упорядочить свои обращения к состоянию так, чтобы повесить весь квик или получить неконсистентные результаты. Автор топика не раз просил арку дать возможность синхронизации из луа, но это, увы, не решит проблему, в квике нет одного общего лока на все, а <I>еще один лок</I> сделает только хуже.<br /><br />Радикальный способ решения проблем - как раз приведенный в статье, межпоточное взаимодействие, по определению требующее синхронизации, локализуется в виде очередей сообщений, а каждый поток работает только со своим состоянием и ему никакая дополнительная синхронизация не нужна в принципе. Это еще не процессы (луа-то общий и нативный процесс тоже общий, хоть авторы и выбрали путающую терминологию), это просто собрали всю синхронизацию в одном месте и избавили конечного кодера от размышлений о ней. Как конкретно решили мне не нравится, но путь правильный.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_wxvkUKI1" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Проблемы такого решения хорошо известны.<br />=============<br />Можно ссылок или ключевиков? Винда как-то работает на сообщениях и ничего страшного, даже порт завершения позже придумали, то есть вперли-таки сообщения в само ядро (и молодцы).<br /><br /><br />* Если посмотреть в сорцы луа, увидим прекрасную вещь: сам по себе интерпретатор всегда работает под локом (<noindex><a href="https://www.lua.org/source/5.3/lvm.c.html#luaV_execute" target="_blank" rel="nofollow">пруф: поищите lua_lock /lua_unlock в этой функции</a></noindex>). То есть, если выполняется только луа-код без вызовов функций, он весь атомарен (и другие потоки ждут). Лок снимается только перед вызовом си-функции. При этом встроенные библиотеки луа тоже состоят из си-функций, поэтому лок может быть снят (и тут же захвачен снова библиотечной функцией) в непредсказуемых местах, что убивает-таки атомарность изменения состояния как целого даже в луа без квика, при этом средств синхронизации со стороны луа не предоставлено. То есть луа защищает консистентность своего состояния, но не консистентность состояния пользовательского кода, с точки зрения луа-кодера он в той же ситуации, в какой и без луа, вот тебе потоки и рули как хочешь. Поэтому и говорю, что проблема не луа-специфичная, проблема в ожиданиях от луа чего-то, чего он не дает, хоть в нем и есть lua_lock. <br />
			<i>26.08.2020 12:13:33, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message48009/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message48009/topic5747/</guid>
			<pubDate>Wed, 26 Aug 2020 12:13:33 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message48003/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_BKwBXR9Q" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />если бы все было так просто, то проблему многопоточности в луа не поднимали бы на форумах &nbsp;уже лет ..надцать.<br />=============<br /> Это именно проблемы многопоточности как таковой, а не многопоточности в луа. В приведенной статье тоже. Как раз автор пришел в конце к правильному выводу, асинхронность рулит. Надо только не забывать, что нынче практически все процессоры многоядерные, даже контроллеры многие, так что многопоточность все равно будет присутствовать, главное ее локализовать и не позволить ей разползтись по всему коду. Конкретно в квике уже отступать некуда, архитектура выбрана такая и трудно предположить, как ее можно обратно-совместимо поправить. Теперь только костыли лепить.<br /><br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />Тоже решал эту проблему<br />=============<br /> Многие решали, &nbsp;<noindex><a href="https://www.researchgate.net/publication/220348782_Exploring_Lua_for_Concurrent_Programming" target="_blank" rel="nofollow">в том числе и основоположники</a></noindex> . К сожалению, конкретно в их решении очереди блокирующие, эдакий qnx получился.<br />=============<br /><br />Дискуссия схоластическая, но замечу, что Вы путаете понятия<br />Проблема многопоточности и проблема синхронизации потоков - это синонимы. т е первое это есть второе.<br />Проблема именно луа а не многопоточности.<br />Как решать задачу синхронизации потоков в конкретном софте хорошо разжевано у Рихтера.<br />Но в луа проблема в том, что есть сборщик мусора и много сторонних библиотек. <br />-------------------------- <br />Вы не внимательно прочитали статью, на которую ссылаетесь.<br />---------------------------<br />цитата: &quot;В этой работе мы исследуем модель, основанную на выполнении<B> потоков без общей памяти</B>, которые используют передачу сообщений для синхронизации и общения.&quot;<br />Т е это фактически многозадачное решение, а не многопоточное.<br />------------------------------<br />и далее цитата:<br />&quot;Связь между процессами Lua происходит исключительно через сообщения. Cвязь с передачей сообщений может быть медленнее по сравнению с общей памятью.&quot;<br />=============== &nbsp;<br />Т е упрощенно, запускаем несколько независимых VMLua как несколько задач, а потом пересылаем данные между ними в виде сообщений OC.<br />Проблемы такого решения хорошо известны.<br /> &nbsp; <br />
			<i>26.08.2020 09:56:28, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message48003/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message48003/topic5747/</guid>
			<pubDate>Wed, 26 Aug 2020 09:56:28 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47947/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_8ueXdAx2" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />если бы все было так просто, то проблему многопоточности в луа не поднимали бы на форумах &nbsp;уже лет ..надцать.<br />=============<br />Это именно проблемы многопоточности как таковой, а не многопоточности в луа. В приведенной статье тоже. Как раз автор пришел в конце к правильному выводу, асинхронность рулит. Надо только не забывать, что нынче практически все процессоры многоядерные, даже контроллеры многие, так что многопоточность все равно будет присутствовать, главное ее локализовать и не позволить ей разползтись по всему коду. Конкретно в квике уже отступать некуда, архитектура выбрана такая и трудно предположить, как ее можно обратно-совместимо поправить. Теперь только костыли лепить.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_LUdMoHRC" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Тоже решал эту проблему<br />=============<br />Многие решали, <noindex><a href="https://www.researchgate.net/publication/220348782_Exploring_Lua_for_Concurrent_Programming" target="_blank" rel="nofollow">в том числе и основоположники</a></noindex>. К сожалению, конкретно в их решении очереди блокирующие, эдакий qnx получился. <br />
			<i>24.08.2020 14:43:07, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47947/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47947/topic5747/</guid>
			<pubDate>Mon, 24 Aug 2020 14:43:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47945/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<noindex><a href="https://zen.yandex.ru/media/id/5d1e1629b4a58500acbc079a/mnogopotochnost-v-lua-moia-glavnaia-oshibka-5d328c0a31878200acc6fbfa" target="_blank" rel="nofollow">https://zen.yandex.ru/media/id/5d1e1629b4a58500acbc079a/mnogopotochnost-v-lua-moia-glavnaia-oshibka-...</a></noindex> <br />
			<i>24.08.2020 14:02:24, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47945/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47945/topic5747/</guid>
			<pubDate>Mon, 24 Aug 2020 14:02:24 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47943/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_MfTU0mjB" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />Если это особенности VMLua<br />=============<br /> Что я выше описал, это на стороне qlua.dll, то есть аркино производство. В самой lua53.dll правки если и есть, то крайне незначительные, практически все строка в строку ложится на сорцы луа из репозитория, как выше из разбора дампа видно.<br /><br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />Проблема многопоточности в луа - это проблема луа.<br />=============<br /> Луа дает lua_lock/lua_unlock и на этом его проблемы с многопоточностью закончены. Можно поспорить, здорово ли, что в некоторых функциях 5.3 вытащили часть обращений к стеку из-под лока, если говорить о проблемах луа. Но вот как сделаны эти самые локи (и не только), это уже вопросы к арке.<br />=============<br />Ва заблуждаетесь,<br />если бы все было так просто, то проблему многопоточности в луа не поднимали бы на форумах &nbsp;уже лет ..надцать.<br />Вот, например, результат попытки решения критическими секциями (look, unlook) <br />и таких воплей в инете много.<br />--------------------<br />Тоже решал эту проблему, но не уверен, что нашел окончательное решение . <br />
			<i>24.08.2020 13:56:23, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47943/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47943/topic5747/</guid>
			<pubDate>Mon, 24 Aug 2020 13:56:23 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47925/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_BckkSgFY" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Если это особенности VMLua<br />=============<br />Что я выше описал, это на стороне qlua.dll, то есть аркино производство. В самой lua53.dll правки если и есть, то крайне незначительные, практически все строка в строку ложится на сорцы луа из репозитория, как выше из разбора дампа видно.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_IVK2KePS" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Проблема многопоточности в луа - это проблема луа.<br />=============<br />Луа дает lua_lock/lua_unlock и на этом его проблемы с многопоточностью закончены. Можно поспорить, здорово ли, что в некоторых функциях 5.3 вытащили часть обращений к стеку из-под лока, если говорить о проблемах луа. Но вот как сделаны эти самые локи (и не только), это уже вопросы к арке. <br />
			<i>21.08.2020 13:28:57, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47925/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47925/topic5747/</guid>
			<pubDate>Fri, 21 Aug 2020 13:28:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47922/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			добавлю свои пять копеек.<br />Если это особенности VMLua то разработчики ничего исправлять не будут. <br />VMLua написана не ими. Они лишь встраивают ее в КВИК и сделали dll интерфейса на луа с хранилищем терминала и обменом с сервером КВИК.<br />--------------------- <br />Проблема многопоточности в луа - это проблема луа.<br />Есть различные решения этой проблемы, но они никак не связаны с КВИК. <br />
			<i>21.08.2020 13:02:59, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47922/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47922/topic5747/</guid>
			<pubDate>Fri, 21 Aug 2020 13:02:59 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47912/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вопросы к разработчикам:<br /><br />1) Исправлены ли в версии терминала 8.8.4 ошибки, описанные в этой теме?<br /><br />2) Если ответ на п.1 отрицательный, то смогли ли вы воспроизвести эти ошибки у себя? <br />
			<i>21.08.2020 12:32:57, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47912/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47912/topic5747/</guid>
			<pubDate>Fri, 21 Aug 2020 12:32:57 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47828/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Ложная тревога. Скрипт 4 написан некорректно, потому сделки теряются. <br />
			<i>18.08.2020 12:16:48, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47828/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47828/topic5747/</guid>
			<pubDate>Tue, 18 Aug 2020 12:16:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47827/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Скрипт 4<br /><table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td>
====code====
<pre>local run, id
local AllTrades = {}
local get, process = 0, 0

function OnAllTrade(alltrade)
&nbsp;&nbsp;if not run then return end
&nbsp;&nbsp;table.sinsert(AllTrades, alltrade)
&nbsp;&nbsp;local n = getNumberOf('all_trades')
&nbsp;&nbsp;SetCell(id, 1, 1, tostring(n), n)
&nbsp;&nbsp;if n == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;get = 1
&nbsp;&nbsp;&nbsp;&nbsp;process = 0
&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;get = get + 1
&nbsp;&nbsp;end
&nbsp;&nbsp;SetCell(id, 1, 2, tostring(get), get)
end

function main()
&nbsp;&nbsp;id = AllocTable()
&nbsp;&nbsp;AddColumn(id, 1, 'all', true, QTABLE_INT_TYPE, 10)
&nbsp;&nbsp;AddColumn(id, 2, 'get', true, QTABLE_INT_TYPE, 10)
&nbsp;&nbsp;AddColumn(id, 3, 'process', true, QTABLE_INT_TYPE, 10)
&nbsp;&nbsp;CreateWindow(id)
&nbsp;&nbsp;SetWindowPos(id, 0, 0, 193, 61)
&nbsp;&nbsp;InsertRow(id, -1)
&nbsp;&nbsp;run = true
&nbsp;&nbsp;while run do
&nbsp;&nbsp;&nbsp;&nbsp;if #AllTrades ~= 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while #AllTrades ~= 0 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.sremove(AllTrades, 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process = process + 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(id, 1, 3, tostring(process), process)
&nbsp;&nbsp;&nbsp;&nbsp;else sleep(1) end
&nbsp;&nbsp;end
end

function OnStop()
&nbsp;&nbsp;run = nil
&nbsp;&nbsp;DestroyTable(id)
end
</pre>
=============
</td></tr></tbody></table><br />Запускаю несколько копий. Делаю перезаказ обезличенных сделок. Предполагается, что все скрипты обработают одинаковое количество сделок.<br />Ан, нет. Спустя чуть больше часа разрываю соединение, чтобы проверить. Часть скриптов потеряла по одной сделке.<br /><table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td>[FILE ID=6852]</td></tr></tbody></table> <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=6852&" width="875" height="680" /><br /><i>18.08.2020 11:59:26, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47827/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47827/topic5747/</guid>
			<pubDate>Tue, 18 Aug 2020 11:59:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47823/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Еще раз поправлюсь. Падает на lua_getglobal. В qlua.dll основным потоком квика вызывается некая функция, она пытается вызвать lua_getglobal(state, &quot;OnAllTrade&quot;) и, если успешно, далее заполняет табличку all_trade и вызывает полученную луа-функцию. То есть это как раз место, где вызывается OnAllTrade. В дампе крэш происходит вот где<br />
====code====
<pre>LUA_API int lua_getglobal (lua_State *L, const char *name) {
&nbsp;&nbsp;Table *reg = hvalue(&#38;G(L)-&#62;l_registry);
&nbsp;&nbsp;lua_lock(L);
&nbsp;&nbsp;return auxgetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name); // &#60;----------- HERE
}</pre>
=============
а еще точнее вот где<br />
====code====
<pre>static int auxgetstr (lua_State *L, const TValue *t, const char *k) {
&nbsp;&nbsp;const TValue *slot;
&nbsp;&nbsp;TString *str = luaS_new(L, k);
&nbsp;&nbsp;if (luaV_fastget(L, t, str, slot, luaH_getstr)) {
&nbsp;&nbsp;&nbsp;&nbsp;setobj2s(L, L-&#62;top, slot);
&nbsp;&nbsp;&nbsp;&nbsp;api_incr_top(L);
&nbsp;&nbsp;}
&nbsp;&nbsp;else {
&nbsp;&nbsp;&nbsp;&nbsp;setsvalue2s(L, L-&#62;top, str); // &#60;-------------------------------------------- HERE
&nbsp;&nbsp;&nbsp;&nbsp;api_incr_top(L);
&nbsp;&nbsp;&nbsp;&nbsp;luaV_finishget(L, t, L-&#62;top - 1, L-&#62;top - 1, slot);
&nbsp;&nbsp;}
&nbsp;&nbsp;lua_unlock(L);
&nbsp;&nbsp;return ttnov(L-&#62;top - 1);
}</pre>
=============
с сообщением
====code====
<pre>Unhandled exception at 0x000007fef3d6420f in info_20200817_223941.dmp: 0xC0000005: Access violation writing location 0x0000000001882900.
</pre>
=============
То есть lua_getglobal что-то (функцию OnAllTrade или nil) извлекает из реестра, пытается засунуть на вершину текущего стека, а туда нельзя писать. Осталось догадаться, а почему собсна нельзя-то, то ли стек реаллоцирован (как? все же под локом), то ли весь стейт (опять - как? все же под локом), то ли страница памяти недоступна. Последнее звучит глупо, но там дальше вызов колбека идет с установкой se_translator, это наводит на мысль, что могла случиться рекурсия под транслятором и in-page-error была неожиданно слопана. Мож попробовать транслятор заменить на явный SEH-фрейм и ловить в нем только то, что стоит ловить? <br />
			<i>18.08.2020 05:11:20, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47823/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47823/topic5747/</guid>
			<pubDate>Tue, 18 Aug 2020 05:11:20 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47822/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_iO7vZnHU" href="/user/1222/" bx-tooltip-user-id="1222">Anton</a> написал:<br /> не нашел, чтобы где-то был лок захвачен перед вызовом<br />=============<br />Наврал, на auxgetstr был джамп из lua_setfield(), а там все хорошо с локом. Отмена воздушной тревоги. Но значит упало на lua_setfield. <br />
			<i>18.08.2020 00:37:09, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47822/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47822/topic5747/</guid>
			<pubDate>Tue, 18 Aug 2020 00:37:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47821/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			По всем признакам разрушение стека луа. Второй вариант попробовал, словил дамп со второй попытки перезаказа, access violation. Поковырял его, что мы видим<table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td>[FILE ID=6851]</td></tr></tbody></table>Курсор на момент падения находится в функции lua53!auxgetstr(). Сама эта функция из lua53 не экспортируется, что-то еще по пути компилятор выбросил при оптимизации, видимо. Прошел по колстеку вверх, не нашел, чтобы где-то был лок захвачен перед вызовом, а сама функция, как внутренняя для луа, его не захватывает. Оно ничего не значит, конечно, не нашел и не захвачен разные вещи, накидываю как идею для арки, куда посмотреть. <br />
			<img src="https://forum.quik.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=6851&" width="668" height="703" /><br /><i>18.08.2020 00:07:33, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47821/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47821/topic5747/</guid>
			<pubDate>Tue, 18 Aug 2020 00:07:33 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47806/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Скрипт 1 оставляем. Скрипт 2 меняем на Скрипт 3:<br /><table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td>
====code====
<pre>local run = true

local function work(alltrade, n)
&nbsp;&nbsp;for i = 1, n do
&nbsp;&nbsp;&nbsp;&nbsp;local d = alltrade.flags % 2
&nbsp;&nbsp;&nbsp;&nbsp;d = bit.band(alltrade.flags, 2)
&nbsp;&nbsp;end
end

local AllTrades = {}
function OnAllTrade(alltrade)
&nbsp;&nbsp;table.ssort({0, 0}, function()
&nbsp;&nbsp;&nbsp;&nbsp;AllTrades&#91;#AllTrades+1&#93; = alltrade
&nbsp;&nbsp;&nbsp;&nbsp;work(alltrade, 10)
&nbsp;&nbsp;&nbsp;&nbsp;return true
&nbsp;&nbsp;end)
end

function main()
&nbsp;&nbsp;while run do
&nbsp;&nbsp;&nbsp;&nbsp;while #AllTrades ~= 0 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local alltrade = table.sremove(AllTrades, 1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.ssort({0, 0}, function()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;work(alltrade, 100)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end)
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;sleep(1)
&nbsp;&nbsp;end
end

function OnStop()
&nbsp;&nbsp;run = nil
end</pre>
=============
</td></tr></tbody></table><br />Можно также запустить несколько копий, чтоб наверняка.<br />Изредка выскакивает ошибка<br /><br />====quote====<br />bad argument #1 to 'ssort' (table expected, got nil)<br />=============<br />в строке<br />
====code====
<pre>table.ssort({0, 0}, function()</pre>
=============
Иногда падает.<br />Причём, может длительное время работать без сбоев. После появления первой ошибки и перезапуска скрипта, ошибки начинают сыпаться чаще. <br />
			<i>17.08.2020 10:54:32, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47806/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47806/topic5747/</guid>
			<pubDate>Mon, 17 Aug 2020 10:54:32 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47789/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			QUIK 8.8.1.5<br />Можно <noindex><a href="https://cloud.mail.ru/public/4CBL/3eNrxnw9X" target="_blank" rel="nofollow">запустить несколько копий</a></noindex>, чтобы наверняка. <br />
			<i>15.08.2020 23:52:36, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47789/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47789/topic5747/</guid>
			<pubDate>Sat, 15 Aug 2020 23:52:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Потокобезопасные функции в Lua 5.3</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message47788/topic5747/">Потокобезопасные функции в Lua 5.3</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Скрипт 1:<br /><table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td>
====code====
<pre>local run = true
function main()
&nbsp;&nbsp;local id = AllocTable()
&nbsp;&nbsp;AddColumn(id, 1, 'Количество', true, QTABLE_INT_TYPE, 13)
&nbsp;&nbsp;CreateWindow(id)
&nbsp;&nbsp;InsertRow(id, -1)
&nbsp;&nbsp;while run do
&nbsp;&nbsp;&nbsp;&nbsp;local len = getNumberOf('all_trades')
&nbsp;&nbsp;&nbsp;&nbsp;SetCell(id, 1, 1, tostring(len), len)
&nbsp;&nbsp;&nbsp;&nbsp;sleep(100)
&nbsp;&nbsp;end
end
function OnStop()
&nbsp;&nbsp;run = nil
end
</pre>
=============
</td></tr></tbody></table><br />Скрипт 2:<br /><table class="forum-spoiler"><thead onclick="if (this.nextSibling.style.display=='none') { this.nextSibling.style.display=''; BX.addClass(this, 'forum-spoiler-head-open'); } else { this.nextSibling.style.display='none'; BX.removeClass(this, 'forum-spoiler-head-open'); } BX.onCustomEvent('BX.Forum.Spoiler:toggle', [{node: this}]); event.stopPropagation();"><tr><th><div>Скрытый текст</div></th></tr></thead><tbody class="forum-spoiler" style="display:none;"><tr><td>
====code====
<pre>local run = true

local AllTrades = {}
function OnAllTrade(alltrade)
&nbsp;&nbsp;table.sinsert(AllTrades, alltrade)
&nbsp;&nbsp;--&#91;&#91;table.ssort({0, 0}, function()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AllTrades&#91;#AllTrades+1&#93; = alltrade
&nbsp;&nbsp;&nbsp;&nbsp;return true
&nbsp;&nbsp;end)&#93;&#93;
end

function main()
&nbsp;&nbsp;while run do
&nbsp;&nbsp;&nbsp;&nbsp;while #AllTrades &#62; 0 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.sremove(AllTrades, 1)
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;sleep(1)
&nbsp;&nbsp;end
end

function OnStop()
&nbsp;&nbsp;run = nil
end</pre>
=============
</td></tr></tbody></table><br />При запущенных обоих скриптах изредка в строке
====code====
<pre>while #AllTrades &#62; 0 do</pre>
=============
возникает странная ошибка:<br />====quote====<br />attempt to compare number with function<br />=============<br />Для воспроизведения можно Получить заново данные по обезличенным сделкам. <br />
			<i>15.08.2020 22:53:42, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message47788/topic5747/</link>
			<guid>http://forum.quik.ru/messages/forum10/message47788/topic5747/</guid>
			<pubDate>Sat, 15 Aug 2020 22:53:42 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
