<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Синхронизация потоков]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Синхронизация потоков форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 02 May 2026 08:17:13 +0300</pubDate>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58940/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_MN7qfMdE" href="/user/14016/" bx-tooltip-user-id="14016">Незнайка</a> написал:<br />Почему так?<br />=============<br />table.ssort захватывает лок луа и не позволяет переключить поток с мейна на основной поток квика (или обратно). Между скриптами он не работает, у каждого скрипта свой лок. <br />
			<i>23.10.2021 16:29:22, Anton.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58940/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58940/topic6555/</guid>
			<pubDate>Sat, 23 Oct 2021 16:29:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message58939/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_BQK810o7" href="/user/115/" bx-tooltip-user-id="115">_sk_</a> написал:<br />Есть следующий &quot;хак&quot;, гарантирующий, что выполнение кода будет только в одном потоке.<br /><br /> 
====code====
<pre>&nbsp;&nbsp; table.ssort ({&nbsp;&nbsp;0 ,&nbsp;&nbsp;1&nbsp;&nbsp;},&nbsp;&nbsp;function (a, b) 
&nbsp;&nbsp;тут_ваш_код
&nbsp;&nbsp; return&nbsp;&nbsp; true 
 end )&nbsp;&nbsp;</pre>
=============
 <br />=============<br /><br />Запускаю одновременно два скрипта. Использую &quot;хак&quot;, рассчитывая, что скрипты будут писать в файл по очереди:<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 f
function OnInit()
&nbsp;&nbsp;f = assert(io.open(getScriptPath() .. "&#92;&#92;file.txt", "a"))
end

function main()
&nbsp;&nbsp;table.ssort({0, 1}, function ()
&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, 100 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f:write("1&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f:flush()
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return true
&nbsp;&nbsp;end)
&nbsp;&nbsp;f:close()
end</pre>
=============

====code====
<pre>local f
function OnInit()
&nbsp;&nbsp;f = assert(io.open(getScriptPath() .. "&#92;&#92;file.txt", "a"))
end

function main()
&nbsp;&nbsp;table.ssort({0, 1}, function ()
&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, 100 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f:write("22&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f:flush()
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;return true
&nbsp;&nbsp;end)
&nbsp;&nbsp;f:close()
end</pre>
=============
</td></tr></tbody></table><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><br />====quote====<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />1<br />22<br /><br />1<br />1<br />22<br />22<br />22<br />22<br />1<br />22<br />1<br />22<br />22<br />22<br />22<br />1<br />22<br />1<br />22<br />1<br />22<br />1<br />22<br />=============</td></tr></tbody></table><br />Почему так? &quot;Хак&quot; не работает с файловыми операциями? <br />
			<i>23.10.2021 16:19:09, Незнайка.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message58939/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message58939/topic6555/</guid>
			<pubDate>Sat, 23 Oct 2021 16:19:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56624/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_zJox6Nai" href="/user/14996/" bx-tooltip-user-id="14996">Sergey</a> написал:<br />Прошу помочь в синхронизации потоков.<br />=============<br /> &nbsp;В документе разработчика QUIK: «Использование Lua в Рабочем месте QUIK.pdf», в разделе «2. Взаимодействие потоков Lua скрипта» описана рекомендуемая схема обработки колбеков. Если придерживаться ее, то проблем многопоточности (! из-за того, что колбеки запускаются в потоке отличном от потока main) в скрипте пользователя не будет.<br /> &nbsp;По ссылке <noindex><a href="https://forum.quik.ru/messages/forum10/message56397/topic6356/#message56397" target="_blank" rel="nofollow">https://forum.quik.ru/messages/forum10/message56397/topic6356/#message56397</a></noindex> вы найдете пример из раздела «2. Взаимодействие потоков Lua скрипта». <br />
			<i>13.07.2021 15:53:37, TGB.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56624/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56624/topic6555/</guid>
			<pubDate>Tue, 13 Jul 2021 15:53:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56623/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_hSFEbxo1" href="/user/14996/" bx-tooltip-user-id="14996">Sergey</a> написал:<br />2 поток удалил запись с индексом 3<br />1 поток удаляет запись с индексом 5 - это уже не та запись, которую он нашел - это проблема.<br />=============<br /><br />Если оба потока удаляют записи в таблице, то да, нужна синхронизация. <br />
			<i>13.07.2021 13:37:22, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56623/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56623/topic6555/</guid>
			<pubDate>Tue, 13 Jul 2021 13:37:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56622/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_jXQiiZVY" href="/user/54/" bx-tooltip-user-id="54">Старатель</a> написал:<br /> <br />Поскольку вы используете потокобезопасные функции, то добавление элемента &nbsp;в конец таблицы &nbsp;(именно такая запись без указания индекса table.sinsert(Trades, trade)) не влечет каких-то неприятных последствий.<br />=============<br />Удаление влечет последствия:<br />1 поток нашел, что ему нужно удалить запись с индексом 5 но пока не удалил<br />2 поток удалил запись с индексом 3<br />1 поток удаляет запись с индексом 5 - это уже не та запись, которую он нашел - это проблема. &nbsp; <br />
			<i>13.07.2021 12:00:14, Sergey.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56622/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56622/topic6555/</guid>
			<pubDate>Tue, 13 Jul 2021 12:00:14 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56620/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_bIKn5K36" href="/user/14996/" bx-tooltip-user-id="14996">Sergey</a> написал:<br />В нее добавляются и из нее удаляются элементы в потоке main и колбеках функциями: 
====code====
<pre>table.sremove (Trades, i) 
table.sinsert (Trades, trade)&nbsp;&nbsp;</pre>
=============
 <br />Проблема в том, что перед добавлением/удалинием элементов происходит перебор элементов таблицы в цикле для поиска нужного индекса. Если нужный элемент найден, а другой поток удалит элемент с меньшим индексом, то индексы сдвинутся и получится ерунда, т.е. нужно синхронизировать потоки.<br />=============<br /><br />Поскольку вы используете потокобезопасные функции, то добавление элемента <B>в конец таблицы</B> (именно такая запись без указания индекса table.sinsert(Trades, trade)) не влечет каких-то неприятных последствий. <br />
			<i>13.07.2021 08:33:02, Старатель.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56620/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56620/topic6555/</guid>
			<pubDate>Tue, 13 Jul 2021 08:33:02 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56402/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br />Поясните пожалуйста, если main с бесконечным циклом без С-функций, в конце каждой итерации sleep это будет работать так:<br />1. Если выполняется код до sleep и приходит колбэк, то колбэк не будет выполняться, пока не начнет выполняться sleep.<br />2. При начале выполнения sleep, начнут выполняться накопленные колбеки, при этом в основном потоке дальше sleep выполнение не пойдет, пока не выполнятся все накопленные колбеки?<br />=============<br />Да. Тут надо уточнить что использование динамической памяти тоже снимает лок - создание новых объектов и строк. При использовании полностью статической памяти и отсутствии манипуляции строк, лок не должен сниматься. Еще надо уточнить что каждый луа-скрипт имеет свой отдельный тред, но колбеки выполняются из главного треда квика, так что пока колбек (любой из них) выполняется или стоит в ожидании, весь терминал будет висеть. <br />
			<i>30.06.2021 23:47:21, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56402/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56402/topic6555/</guid>
			<pubDate>Wed, 30 Jun 2021 23:47:21 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56380/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_R2uyyT93" href="/user/14644/" bx-tooltip-user-id="14644">Артем</a> написал:<br /> Код, не вызывающий никаких С-функций, выполняется атомарно. Так что можно использовать глобальные переменные в качестве мутексов.<br />=============<br />Поясните пожалуйста, если main с бесконечным циклом без С-функций, в конце каждой итерации sleep это будет работать так:<br />1. Если выполняется код до sleep и приходит колбэк, то колбэк не будет выполняться, пока не начнет выполняться sleep.<br />2. При начале выполнения sleep, начнут выполняться накопленные колбеки, при этом в основном потоке дальше sleep выполнение не пойдет, пока не выполнятся все накопленные колбеки? <br />
			<i>30.06.2021 13:14:14, Sergey.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56380/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56380/topic6555/</guid>
			<pubDate>Wed, 30 Jun 2021 13:14:14 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56376/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_J8Fimbee" href="/user/14996/" bx-tooltip-user-id="14996">Sergey</a> написал:<br />Спасибо, за ответ. А потоки синхронизировать в Lua можно?<br />=============<br />Код, не вызывающий никаких С-функций, выполняется атомарно. Так что можно использовать глобальные переменные в качестве мутексов. <br />
			<i>30.06.2021 10:01:05, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56376/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56376/topic6555/</guid>
			<pubDate>Wed, 30 Jun 2021 10:01:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56375/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Спасибо! <br />
			<i>30.06.2021 08:32:41, Sergey.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56375/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56375/topic6555/</guid>
			<pubDate>Wed, 30 Jun 2021 08:32:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56374/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Есть следующий &quot;хак&quot;, гарантирующий, что выполнение кода будет только в одном потоке.<br /><br />
====code====
<pre>table.ssort({ 0, 1 }, function(a, b) 
&nbsp;&nbsp;тут_ваш_код
&nbsp;&nbsp;return true
end)</pre>
=============
<br />Идея в том, что выполняется &quot;бесполезный&quot; ssort на таблице из двух элементов с указанным компаратором. Ваш код выполнится один раз внутри этого компаратора.<br /><br />Только не надо злоупотреблять этим, иначе терминал начнёт тормозить. <br />
			<i>30.06.2021 08:19:40, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56374/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56374/topic6555/</guid>
			<pubDate>Wed, 30 Jun 2021 08:19:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56373/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Спасибо, за ответ. А потоки синхронизировать в Lua можно? <br />
			<i>30.06.2021 08:11:53, Sergey.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56373/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56373/topic6555/</guid>
			<pubDate>Wed, 30 Jun 2021 08:11:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56372/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Решение очень простое: не используйте одни и те же данные в разных потоках. Один из примеров практической реализации такого принципа это двойная буферизация. <br />
			<i>30.06.2021 05:12:26, Артем.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56372/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56372/topic6555/</guid>
			<pubDate>Wed, 30 Jun 2021 05:12:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Синхронизация потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message56371/topic6555/">Синхронизация потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Добрый день.<br />Прошу помочь в синхронизации потоков.<br />Есть глобальная таблица
====code====
<pre>Trades = {}</pre>
=============
В нее добавляются и из нее удаляются элементы в потоке main и колбеках функциями:
====code====
<pre>table.sremove(Trades, i) 
table.sinsert(Trades, trade)</pre>
=============
<br />Проблема в том, что перед добавлением/удалинием элементов происходит перебор элементов таблицы в цикле для поиска нужного индекса. Если нужный элемент найден, а другой поток удалит элемент с меньшим индексом, то индексы сдвинутся и получится ерунда, т.е. нужно синхронизировать потоки. В с++ я бы использовал mutex, в lua я нашел подобие mutex (возможно ошибаюсь), функции:<br /><noindex><a href="https://www.lua.org/manual/2.1/section3_5.html" target="_blank" rel="nofollow">https://www.lua.org/manual/2.1/section3_5.html</a></noindex><br />
====code====
<pre>int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_lock (void);
lua_Object lua_getlocked&nbsp;&nbsp;(int ref);
void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lua_pushlocked (int ref);
void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lua_unlock (int ref);</pre>
=============
но я не понимаю как их использовать и не могу найти примеры (судя по объявлению функций это вообще с++).<br />Подскажите как можно решить проблему или где найти примеры/описание? <br />
			<i>29.06.2021 21:09:50, Sergey.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message56371/topic6555/</link>
			<guid>http://forum.quik.ru/messages/forum10/message56371/topic6555/</guid>
			<pubDate>Tue, 29 Jun 2021 21:09:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
