<?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, 23 May 2026 17:46:08 +0300</pubDate>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80809/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_71HIyLEO" href="/user/17142/" bx-tooltip-user-id="17142">Йцукен</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />Поправьте так и ничего не повесится<br />=============<br /> А слона-то вы и не заметили. Я специально модифицировал скрипт, чтобы показать, какие инструкции выполняются под блокировкой (в используемой версии Lua).<br />=============<br />Если Вам интересно изучить, какие функции выполняются с блокировкой в Lua, то изучайте исходники. <br /><noindex><a href="https://www.lua.org/source/5.4/lobject.h.html#hvalue" target="_blank" rel="nofollow">https://www.lua.org/source/5.4/lobject.h.html#hvalue</a></noindex><br />Там все есть. Я этот этап прошел очень давно. Не вижу особого смысла снова возвращаться к этой теме. &nbsp; <br />
			<i>08.01.2026 06:58:24, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80809/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80809/topic962/</guid>
			<pubDate>Thu, 08 Jan 2026 06:58:24 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80805/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_H1OvyzYk" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Поправьте так и ничего не повесится<br />=============<br />А слона-то вы и не заметили. Я специально модифицировал скрипт, чтобы показать, какие инструкции выполняются под блокировкой (в используемой версии Lua). <br />
			<i>07.01.2026 09:35:34, Йцукен.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80805/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80805/topic962/</guid>
			<pubDate>Wed, 07 Jan 2026 09:35:34 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80804/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_o1gwOoH6" href="/user/17142/" bx-tooltip-user-id="17142">Йцукен</a> написал:<br /><br />Теперь если ваш код модифицировать следующим образом:<br /> 
====code====
<pre>&nbsp;&nbsp; local&nbsp;&nbsp;x, y
 function&nbsp;&nbsp; main ()
&nbsp;&nbsp; while&nbsp;&nbsp; true&nbsp;&nbsp; do 
&nbsp;&nbsp;&nbsp;&nbsp;y&nbsp;&nbsp;=&nbsp;&nbsp; 99 
&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;&nbsp;=&nbsp;&nbsp; 199 
&nbsp;&nbsp;&nbsp;&nbsp;x, y&nbsp;&nbsp;=&nbsp;&nbsp;y, x
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;x ~ =&nbsp;&nbsp; 99&nbsp;&nbsp; or&nbsp;&nbsp;y ~ =&nbsp;&nbsp; 199&nbsp;&nbsp; then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;=&nbsp;&nbsp;tostring(x) .. "," .. tostring(y) .. "&#92;n"
&nbsp;&nbsp;&nbsp;&nbsp; end 
&nbsp;&nbsp; end&nbsp;&nbsp;
 end&nbsp;&nbsp; </pre>
=============
 и запустить, то QUIK повесится (версия Lua: 5.4.1).<br /><br /><br /><br />=============<br />Поправьте так и ничего не повесится:<br />
====code====
<pre>local&nbsp;&nbsp;x, y
 function&nbsp;&nbsp; main ()
&nbsp;&nbsp; while&nbsp;&nbsp; true&nbsp;&nbsp; do 
&nbsp;&nbsp;&nbsp;&nbsp;y=99
&nbsp;&nbsp;&nbsp;&nbsp;x= 99 
&nbsp;&nbsp;&nbsp;&nbsp;x, y&nbsp;&nbsp;=&nbsp;&nbsp;y, x
&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;x~= 99&nbsp;&nbsp; or&nbsp;&nbsp;y ~= 199&nbsp;&nbsp; then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;=&nbsp;&nbsp;tostring(x) .. "," .. tostring(y) .. "&#92;n"
&nbsp;&nbsp;&nbsp;&nbsp; end 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep(1);
&nbsp;&nbsp; end&nbsp;&nbsp;
 end&nbsp;&nbsp;</pre>
============= <br />
			<i>07.01.2026 06:40:10, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80804/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80804/topic962/</guid>
			<pubDate>Wed, 07 Jan 2026 06:40:10 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80798/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_Eb9Oar64" href="/user/62/" bx-tooltip-user-id="62">nikolz</a>, вы же сами дали ссылку на <noindex><a href="https://ru.wikipedia.org/wiki/Атомарная_операция" target="_blank" rel="nofollow">статью</a></noindex>:<br /><br />====quote====<br />Атомарность операций может обеспечиваться аппаратно (аппаратурой) и программно (программным кодом). В первом случае используются особые машинные инструкции, атомарность выполнения которых гарантируется аппаратурой. Во втором случае используются специальные программные средства синхронизации, с помощью которых осуществляется блокировка разделяемого ресурса; после блокировки выполняется операция, которую требуется выполнить атомарно. Блокировка представляет собой атомарную операцию, которая либо предоставляет ресурс в пользование потоку, либо сообщает потоку о том, что ресурс уже используется другим потоком или процессом (занят).<br />=============<br /><br />Теперь если ваш код модифицировать следующим образом:<br />
====code====
<pre>local x, y
function main()
&nbsp;&nbsp;while true do
&nbsp;&nbsp;&nbsp;&nbsp;y = 99
&nbsp;&nbsp;&nbsp;&nbsp;x = 199
&nbsp;&nbsp;&nbsp;&nbsp;x, y = y, x
&nbsp;&nbsp;&nbsp;&nbsp;if x ~= 99 or y ~= 199 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s = tostring(x)..","..tostring(y).."&#92;n"
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;end 
end</pre>
=============
и запустить, то QUIK повесится (версия Lua: 5.4.1).<br /><br />Если же конкатенацию строк с си-функцией tostring вынести за пределы блока if<br />
====code====
<pre>local x, y
function main()
&nbsp;&nbsp;while true do
&nbsp;&nbsp;&nbsp;&nbsp;y = 99
&nbsp;&nbsp;&nbsp;&nbsp;x = 199
&nbsp;&nbsp;&nbsp;&nbsp;x, y = y, x
&nbsp;&nbsp;&nbsp;&nbsp;if x ~= 99 or y ~= 199 then end
&nbsp;&nbsp;&nbsp;&nbsp;s = tostring(x)..","..tostring(y).."&#92;n"
&nbsp;&nbsp;end 
end</pre>
=============
то QUIK, хоть и загрузит одно ядро на 100%, но остаётся доступным и позволяет остановить скрипт.<br />Что, как бы, намекает, что инструкции<br />
====code====
<pre>&nbsp;&nbsp;&nbsp;&nbsp;y = 99
&nbsp;&nbsp;&nbsp;&nbsp;x = 199
&nbsp;&nbsp;&nbsp;&nbsp;x, y = y, x
&nbsp;&nbsp;&nbsp;&nbsp;if x ~= 99 or y ~= 199 then</pre>
=============
выполняются под блокировкой.<br />А вот преобразование числа в строку - нет.<br />Отсюда и ответ на 2-й <noindex><a href="https://forum.quik.ru/messages/forum10/message80793/topic962/#message80793" target="_blank" rel="nofollow">вопрос</a></noindex>: вы не сможете таким образом гарантированно вывести в файл значения переменных x и y, которые были в момент проверки их оператором if, поскольку другой поток может подменить их значения в этот момент. <br />
			<i>06.01.2026 23:19:26, Йцукен.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80798/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80798/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 23:19:26 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80794/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_62rulAsI" href="/user/17142/" bx-tooltip-user-id="17142">Йцукен</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />x,y=y,x;<br /> &nbsp; &nbsp; &nbsp; &nbsp;if x~=99 or y~=199 then<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Log:write(tostring(x)..&quot;,&quot;..tostring(y)..&quot;\n&quot;)<br />=============<br /> Даже если вы поймаете тут ошибку, то подумайте вот о чём:<br />1) Может ли другой поток поменять значения переменных перед if ? Будет ли это означать отсутсвие атомарности в операторе присваивания?<br />2) Может ли другой поток поменять значения переменных перед выводом их в файл, т.е. гарантированно ли вы получите те значения, которые проверяли в if ?<br /><br /> &nbsp; &nbsp; Скрытый текст &nbsp; &nbsp; &nbsp; Ответ на 2-й вопрос - Нет.<br />=============<br />Не знаю что Вы называете атомарностью операции. <br />Но В языке программирования Lua нет специальных атомарных операций. <br />-------------------------------------<br />Дело в том, что скрипт луа выполняется на виртуальной машине, а его операторы преобразуются в байт код. &nbsp;Т е любой оператор -это набор функций на СИ. Поэтому официально в луа нет атомарных операций. <br />Можно говорить о синхронизации потоков при обращении к данным. Что делается известными методами, в том числе и в VMLua и в библиотеке &nbsp;QLUA. <br />-----------------<br />Кроме того, VMLua изначально сделана не многопоточная( это всем известно). &nbsp;Поэтому , если механизм синхронизации встроен, то ответ на ваш 2 вопрос будет нет, а если он не встроен , то ответ Да.<br />Рекомендую открыть в КВИКе еще поток ОС с VMLua как корутину (так открыт поток main) и обратится из него к общим переменным. &nbsp;И Вы увидите ответ на Ваш вопрос. ( У Вас QUIK все просто вылетит аварийно) <br />
			<i>06.01.2026 16:14:05, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80794/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80794/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 16:14:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80793/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_9uQMYZBK" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />x,y=y,x;<br /> &nbsp; &nbsp; &nbsp; &nbsp;if x~=99 or y~=199 then<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Log:write(tostring(x)..","..tostring(y).."\n")<br />=============<br />Даже если вы поймаете тут ошибку, то подумайте вот о чём:<br />1) Может ли другой поток поменять значения переменных перед if ? Будет ли это означать отсутсвие атомарности в операторе присваивания?<br />2) Может ли другой поток поменять значения переменных перед выводом их в файл, т.е. гарантированно ли вы получите те значения, которые проверяли в if ?<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>Ответ на 2-й вопрос - Нет.</td></tr></tbody></table> <br />
			<i>06.01.2026 15:19:37, Йцукен.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80793/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80793/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 15:19:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80792/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_I5692Ykv" href="/user/17142/" bx-tooltip-user-id="17142">Йцукен</a> написал:<br />В моём тесте неатомарность проявится, если значение любой из переменных (a1, a2, a3, a4, a5, a6, a7, a8, a9) в любой момент времени будет отличным от остальных. Это будет означать, что поток main стал читать значения переменных в то время, когда в другом потоке произошла запись значений только части из них.<br />=============<br />Другими словами, если мы попадём внутрь блока<br />
====code====
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if a1 ~= a2 or a1 ~= a3 or a1 ~= a4 or a1 ~= a5 or a1 ~= a6 or a1 ~= a7 or a1 ~= a8 or a1 ~= a9 or a1 == nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error("error")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end</pre>
============= <br />
			<i>06.01.2026 15:10:18, Йцукен.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80792/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80792/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 15:10:18 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80791/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_2acY2E5Q" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Вы, очевидно, ждете системные ошибки, типа ошибок обращения к памяти. Верно?<br />=============<br />Не верно. В моём тесте неатомарность проявится, если значение любой из переменных (a1, a2, a3, a4, a5, a6, a7, a8, a9) в любой момент времени будет отличным от остальных. Это будет означать, что поток main стал читать значения переменных в то время, когда в другом потоке произошла запись значений только части из них.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_lbHfoyct" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />Вот вам тест:<br />=============<br />И? Результаты, выводы? <br />
			<i>06.01.2026 15:08:05, Йцукен.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80791/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80791/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 15:08:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80790/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			тест поправил:
====code====
<pre>minfo=debug.getinfo(1, "S").source:sub(2);&nbsp;&nbsp;path=minfo:match("(.*&#91;/&#92;&#92;&#93;)") or "."
Log=io.open(path.."/test.log","w"); 
fconnect=1; 
local x,y;
function main()
&nbsp;&nbsp;&nbsp;&nbsp;while true do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y=99 x=199&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x,y=y,x;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if x~=99 or y~=199 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write(tostring(x)..","..tostring(y).."&#92;n");Log:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end 
end&nbsp;&nbsp; 
function OnParam(c, s) 
&nbsp;&nbsp; y=100 x=200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x,y=y,x;
&nbsp;&nbsp; if x~=100 or y~=200 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write(tostring(x)..","..tostring(y).."&#92;n");Log:flush();
&nbsp;&nbsp;&nbsp;&nbsp;end
end

function OnInit(p) 
 fconnect=1;
end</pre>
============= <br />
			<i>06.01.2026 14:39:21, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80790/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80790/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 14:39:21 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80789/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<noindex><a href="https://forum.quik.ru/user/17142/" target="_blank" rel="nofollow">Йцукен</a></noindex>,<br />Вы, очевидно, ждете системные ошибки, типа ошибок обращения к памяти. Верно?<br />Но их может и не быть.<br />Атомарность обнаруживается например тем, что записав в ячейку 1 и прибавив к ней 1 Вы ожидаете прочитать из нее 2, а читаете 0, так как с момента прибавления 1 до момента чтения результата другое ядро успело записать в эту ячейку ноль. <br /> &nbsp; <br />
			<i>06.01.2026 14:29:22, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80789/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80789/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 14:29:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80788/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_L53XxJR4" href="/user/17142/" bx-tooltip-user-id="17142">Йцукен</a> написал:<br /> <br />====quote====<br /><noindex><a href="/user/62/" target="_blank" rel="nofollow">nikolz</a></noindex> написал:<br />как вы проверили, что выполняется атомарно? &nbsp;Где доказательство?<br />=============<br /> Вот: &nbsp;<noindex><a href="https://forum.quik.ru/messages/forum10/message80784/topic962/#message80784" target="_blank" rel="nofollow">#11</a></noindex> <br /> <br />====quote====<br /><noindex><a href="/user/17142/" target="_blank" rel="nofollow">Йцукен</a></noindex> написал:<br />такой код работает без ошибок<br />=============<br /> <br />Можете опровергнуть?<br />=============<br />Как Вы это установили? &nbsp;какие ошибки?<br />---------------------<br />Вот вам тест:
====code====
<pre>minfo=debug.getinfo(1, "S").source:sub(2);&nbsp;&nbsp;path=minfo:match("(.*&#91;/&#92;&#92;&#93;)") or "."
Log=io.open(path.."/test.log","w"); 
fconnect=1; 
local x,y;
function main()
&nbsp;&nbsp;while&nbsp;&nbsp;fconnect do 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fconnect=2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while fconnect==2 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y=99 x=199&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x,y=y,x;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if x~=99 or y~=199 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write(tostring(x)..","..tostring(y).."&#92;n");Log:flush();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(10);
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000) 
end&nbsp;&nbsp; 
function OnParam(c, s) 
&nbsp;&nbsp; y=100 x=200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x,y=y,x;
&nbsp;&nbsp; if x~=100 or y~=200 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log:write(tostring(x)..","..tostring(y).."&#92;n");Log:flush();
&nbsp;&nbsp;&nbsp;&nbsp;end
end

function OnInit(p) 
 fconnect=1;
end</pre>
============= <br />
			<i>06.01.2026 14:19:54, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80788/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80788/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 14:19:54 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80787/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Hthp262l" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />как вы проверили, что выполняется атомарно? &nbsp;Где доказательство?<br />=============<br />Вот: <noindex><a href="https://forum.quik.ru/messages/forum10/message80784/topic962/#message80784" target="_blank" rel="nofollow">#11</a></noindex><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_ziOqZ6jD" href="/user/17142/" bx-tooltip-user-id="17142">Йцукен</a> написал:<br />такой код работает без ошибок<br />=============<br /><br />Можете опровергнуть? <br />
			<i>06.01.2026 13:01:50, Йцукен.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80787/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80787/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 13:01:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80786/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Атомарная (<noindex><a href="https://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%B5%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA" target="_blank" rel="nofollow">греч.</a></noindex> άτομος — неделимое) операция — операция, которая либо выполняется целиком, либо не выполняется вовсе; операция, которая не может быть частично выполнена и частично не выполнена.<br /><noindex><a href="https://ru.wikipedia.org/wiki/Атомарная_операция" target="_blank" rel="nofollow">https://ru.wikipedia.org/wiki/Атомарная_операция</a></noindex> <br />
			<i>06.01.2026 12:51:38, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80786/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80786/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 12:51:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80785/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Xa7R5bm8" href="/user/17142/" bx-tooltip-user-id="17142">Йцукен</a> написал:<br />Похоже, операция множественного присвоения выполняется атомарно.<br />Вот такой код работает без ошибок:<br /> &nbsp; &nbsp; Скрытый текст &nbsp; &nbsp; &nbsp; &nbsp;
====code====
<pre>&nbsp;&nbsp; local&nbsp;&nbsp;run&nbsp;&nbsp;=&nbsp;&nbsp; true 
 local&nbsp;&nbsp;a1, a2, a3, a4, a5, a6, a7, a8, a9&nbsp;&nbsp;=&nbsp;&nbsp; 0 ,&nbsp;&nbsp;0 ,&nbsp;&nbsp;0 ,&nbsp;&nbsp;0 ,&nbsp;&nbsp;0 ,&nbsp;&nbsp;0 ,&nbsp;&nbsp;0 ,&nbsp;&nbsp;0 ,&nbsp;&nbsp;0 
 local&nbsp;&nbsp;n&nbsp;&nbsp;=&nbsp;&nbsp; 100 

 function&nbsp;&nbsp; OnAllTrade ()
&nbsp;&nbsp; for&nbsp;&nbsp;i&nbsp;&nbsp;=&nbsp;&nbsp; 1 , n&nbsp;&nbsp;do 
&nbsp;&nbsp;&nbsp;&nbsp;a1, a2, a3, a4, a5, a6, a7, a8, a9&nbsp;&nbsp;=&nbsp;&nbsp;i, i, i, i, i, i, i, i, i
&nbsp;&nbsp; end 
 end 

 function&nbsp;&nbsp; OnParam ()
&nbsp;&nbsp; for&nbsp;&nbsp;i&nbsp;&nbsp;=&nbsp;&nbsp; 1 , n&nbsp;&nbsp;do 
&nbsp;&nbsp;&nbsp;&nbsp;a1, a2, a3, a4, a5, a6, a7, a8, a9&nbsp;&nbsp;=&nbsp;&nbsp;i, i, i, i, i, i, i, i, i
&nbsp;&nbsp; end 
 end 

 function&nbsp;&nbsp; main ()
&nbsp;&nbsp; while&nbsp;&nbsp;run&nbsp;&nbsp;do 
&nbsp;&nbsp;&nbsp;&nbsp; sleep ( 1 )
&nbsp;&nbsp;&nbsp;&nbsp; local&nbsp;&nbsp;t&nbsp;&nbsp;=&nbsp;&nbsp;prec_time()
&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp;i&nbsp;&nbsp;=&nbsp;&nbsp; 1 , n&nbsp;&nbsp;do 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp;a1 ~ =&nbsp;&nbsp;a2&nbsp;&nbsp;or&nbsp;&nbsp;a1 ~ =&nbsp;&nbsp;a3&nbsp;&nbsp;or&nbsp;&nbsp;a1 ~ =&nbsp;&nbsp;a4&nbsp;&nbsp;or&nbsp;&nbsp;a1 ~ =&nbsp;&nbsp;a5&nbsp;&nbsp;or&nbsp;&nbsp;a1 ~ =&nbsp;&nbsp;a6&nbsp;&nbsp;or&nbsp;&nbsp;a1 ~ =&nbsp;&nbsp;a7&nbsp;&nbsp;or&nbsp;&nbsp;a1 ~ =&nbsp;&nbsp;a8&nbsp;&nbsp;or&nbsp;&nbsp;a1 ~ =&nbsp;&nbsp;a9&nbsp;&nbsp;or&nbsp;&nbsp;a1&nbsp;&nbsp;=&nbsp;&nbsp;=&nbsp;&nbsp; nil&nbsp;&nbsp; then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error( "error" )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end 
&nbsp;&nbsp;&nbsp;&nbsp; end 
&nbsp;&nbsp; end 
 end 

 function&nbsp;&nbsp; OnStop ()
&nbsp;&nbsp;run&nbsp;&nbsp;=&nbsp;&nbsp; nil 
 end&nbsp;&nbsp; </pre>
=============
 <br />=============<br />и как вы проверили, что выполняется атомарно? &nbsp;Где доказательство? <br />
			<i>06.01.2026 12:49:03, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80785/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80785/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 12:49:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80784/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <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>
====code====
<pre>local run = true
local a1, a2, a3, a4, a5, a6, a7, a8, a9 = 0, 0, 0, 0, 0, 0, 0, 0, 0
local n = 100

function OnAllTrade()
&nbsp;&nbsp;for i = 1, n do
&nbsp;&nbsp;&nbsp;&nbsp;a1, a2, a3, a4, a5, a6, a7, a8, a9 = i, i, i, i, i, i, i, i, i
&nbsp;&nbsp;end
end

function OnParam()
&nbsp;&nbsp;for i = 1, n do
&nbsp;&nbsp;&nbsp;&nbsp;a1, a2, a3, a4, a5, a6, a7, a8, a9 = i, i, i, i, i, i, i, i, i
&nbsp;&nbsp;end
end

function main()
&nbsp;&nbsp;while run do
&nbsp;&nbsp;&nbsp;&nbsp;sleep(1)
&nbsp;&nbsp;&nbsp;&nbsp;local t = prec_time()
&nbsp;&nbsp;&nbsp;&nbsp;for i = 1, n do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if a1 ~= a2 or a1 ~= a3 or a1 ~= a4 or a1 ~= a5 or a1 ~= a6 or a1 ~= a7 or a1 ~= a8 or a1 ~= a9 or a1 == nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error("error")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;end
end

function OnStop()
&nbsp;&nbsp;run = nil
end</pre>
=============
</td></tr></tbody></table> <br />
			<i>06.01.2026 09:14:37, Йцукен.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80784/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80784/topic962/</guid>
			<pubDate>Tue, 06 Jan 2026 09:14:37 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80781/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<noindex><a href="https://forum.quik.ru/user/17142/" target="_blank" rel="nofollow">Йцукен</a></noindex>,<br />Интересно, как Вы реализуете обращение к этим переменным в разных потоках? <br />
			<i>05.01.2026 10:07:07, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80781/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80781/topic962/</guid>
			<pubDate>Mon, 05 Jan 2026 10:07:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80780/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Szv1vUo8" href="/user/17142/" bx-tooltip-user-id="17142">Йцукен</a> написал:<br />a, b = 1, 2<br />=============<br />это выполнится на этапе компиляции.<br />а это<br />x, y = y, x<br /> как указано ранее <br />
			<i>05.01.2026 10:03:43, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80780/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80780/topic962/</guid>
			<pubDate>Mon, 05 Jan 2026 10:03:43 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80779/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_3zfxBySq" href="/user/62/" bx-tooltip-user-id="62">nikolz</a> написал:<br />При множественном присваивании Lua сначала вычисляет все значения, а затем выполняет присваивание.<br />=============<br />А если все значения уже вычислены, как в примерах выше? <br />
			<i>05.01.2026 09:52:58, Йцукен.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80779/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80779/topic962/</guid>
			<pubDate>Mon, 05 Jan 2026 09:52:58 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80778/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_7ADzHj13" href="/user/17142/" bx-tooltip-user-id="17142">Йцукен</a> написал:<br />атомарной операция присвоения одновременно нескольким переменным<br />=============<br />нет.<br />При множественном присваивании Lua сначала вычисляет все значения, а затем выполняет присваивание. <br />
			<i>05.01.2026 07:36:03, nikolz.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80778/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80778/topic962/</guid>
			<pubDate>Mon, 05 Jan 2026 07:36:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message80776/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Является ли атомарной операция присвоения одновременно нескольким переменным?
====code====
<pre>a, b = 1, 2</pre>
=============
или
====code====
<pre>x, y = y, x</pre>
============= <br />
			<i>04.01.2026 21:53:08, Йцукен.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message80776/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message80776/topic962/</guid>
			<pubDate>Sun, 04 Jan 2026 21:53:08 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message8903/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Спасибо, можно считать, что тема закрыта. <br />
			<i>22.09.2015 10:12:33, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message8903/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message8903/topic962/</guid>
			<pubDate>Tue, 22 Sep 2015 10:12:33 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message8900/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Действия типа<br /><br />a={}<br />a.xxx = 1<br />a.yyy = 2<br />a.xxx = nil<br /><br />и подобные безопасны <br />
			<i>22.09.2015 09:57:44, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message8900/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message8900/topic962/</guid>
			<pubDate>Tue, 22 Sep 2015 09:57:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message8899/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Я понимаю, почему функции table.sinsert и table.sremove введены в QLua: надо не только вставить/удалить один элемент, но ещё и сдвинуть остальные элементы таблицы по номерам.<br /><br />Как написано выше по ссылке, я сам так делаю при передаче данных из коллбэков в main. Вопрос был про одиночное добавление/удаление элементов в таблицу без сдвига всех остальных. По идее, он должен работать, иначе будет рушиться даже этот алгоритм. <br />
			<i>22.09.2015 09:54:10, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message8899/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message8899/topic962/</guid>
			<pubDate>Tue, 22 Sep 2015 09:54:10 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message8896/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Да, проблема существует.<br /><br /><B><noindex><a href="http://www.bot4sale.ru/blog-menu/qlua/spisok-statej/455-queue.html" target="_blank" rel="nofollow">http://www.bot4sale.ru/blog-menu/qlua/spisok-statej/455-queue.html</a></noindex></B><br /><br />или table.sinsert &nbsp; table.sremove <br />
			<i>22.09.2015 09:38:07, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message8896/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message8896/topic962/</guid>
			<pubDate>Tue, 22 Sep 2015 09:38:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message8885/topic962/">Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Предположим, что в скрипте заведена таблица t. В потоке коллбэков в функции OnAllTrade() в таблицу t вставляются элементы. Пусть ключом будет цена, а значением -- номер сделки. В потоке main из этой таблицы происходит чтение данных по ключу. Поскольку потоки работают параллельно, то не исключена, например, такая ситуация.<br /><br />1) В потоке коллбэка в таблицу вставляется новый элемент, что приводит к необходимости перестройки внутренней структуры таблицы t (не знаю, как реализована таблица внутри Lua, но по аналогии c реализацией хэш-таблиц в Java допускаю, что иногда при вставках приходится существенно поменять внутренности объекта).<br /><br />2) Процесс внутренней перестройки таблицы ещё не закончен, её внутреннее состояние неконсистентно, а в параллельном потоке main() начинается чтение из таблицы t по какому-то ключу.<br /><br />Вопросы:<br /><br />а) Есть ли гарантия, что из таблицы будет корректно прочитан элемент (возможно, nil), а не произойдёт какая-то ошибка?<br /><br />б) А если в п.1 элементы удаляются из таблицы?<br /><br />Спрашиваю потому, что одно дело обеспечить целостность примитивных данных, другое дело -- объектов со сложной внутренней структурой. Разработчики QLua не зря добавили специальные "Потокобезопасные функции для работы с таблицами Lua". Если добавление/удаление данных из lua-таблиц в самой lua-машине реализовано потокобезопасно, то это положительно отвечает на вопросы а) и б). Если нет -- тогда беда. <br />
			<i>22.09.2015 06:03:55, _sk_.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message8885/topic962/</link>
			<guid>http://forum.quik.ru/messages/forum10/message8885/topic962/</guid>
			<pubDate>Tue, 22 Sep 2015 06:03:55 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
