<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: std::recursive_mutex и cинхронизация потоков в Lua]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме std::recursive_mutex и cинхронизация потоков в Lua форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 03 May 2026 03:24:35 +0300</pubDate>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14432/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_IkLoAru4" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br />в созданном системном потоке в рамках main_lua_thread вызывается Lua-функция main. Без установки обработчиков ошибок это выглядит так: lua_getglobal(main_lua_thread, &quot;main&quot;); lua_pcall(main_lua_thread, 1, 0, 0);<br /><br />=============<br />Нет функции редактирования, поэтому исправляюсь:<br />lua_pcall(main_lua_thread, <B><U>0</U></B>, 0, 0); <br />
			<i>23.03.2016 13:41:17, Вячеслав +.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14432/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14432/topic1464/</guid>
			<pubDate>Wed, 23 Mar 2016 13:41:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14413/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_2RBBVqNn" href="/user/137/" bx-tooltip-user-id="137">тот самый</a> написал:<br /><br />====quote====<br /> Вячеслав &nbsp; написал:<br />Да, создаются 2 системных потока, да, в каждом из них выполняется lua_pcall<br />=============<br />Всегда, при разговоре на эту тему - разделяйте понятия:<br />системный поток - это НЕ LUA-поток, а поток ОС<br />LUA-поток - это не поток ОС. LUA-поток - сродни корутинам.<br /><br />В самой LUA - никакие системные потоки - не создаются<br />=============<br /><br />Ок, разделяю:<br />Есть системный поток (основной поток процесса info.exe). При запуске Lua-скрипта:<br /><ul><li>создаётся lua_State *global = luaL_newstate();<br /><li>выполняется код Lua-скрипта (по-простому - всё что вне декларций функций)<br /><li>вызывается OnInit(имя_файла_скрипта)<br /><li>создаётся новый Lua поток lua_State *main_lua_thread = lua_newthread(global);<br /><li>созданный Lua-поток помещается в LUA_REGISTRYINDEX (luaL_ref), чтобы он не разрушался, и чтобы иметь возможность вызывать callback'и в основном Lua-потоке global.<br /><li>создаётся новый системный поток<br /><li>в созданном системном потоке в рамках main_lua_thread вызывается Lua-функция main. Без установки обработчиков ошибок это выглядит так: lua_getglobal(main_lua_thread, &quot;main&quot;); lua_pcall(main_lua_thread, 1, 0, 0);<br /><li>в процессе работы всё просто. Когда терминал хочет вызвать callback, он выполняет: lua_getglobal(global, &quot;OnQuote&quot;); lua_push... &nbsp;lua_pcall(global, *кол-во аргументов*, 0, *обработчик ошибок*); в случае ошибки, предполагаю, что терминал принудительно останавливает новый системный поток и останавливает выполнение скрипта. В этом случае возможна утечка памяти/ресурсов (ресурсов, например, если были загружены .dll с помощью require).<br /><li>когда в новом системном потоке происходит выход из ф-ции lua_pcall, новый системный поток завершается<br /><li>выполняется закрытие lua_close(global). main_lua_thread Lua-поток разрушится сам, т.к. он хранится в REGISTRYINDEX в global lua_State.<br /></ul><br />====quote====<br /><a class="blog-p-user-name" id="bp_RiGsQ8tA" href="/user/137/" bx-tooltip-user-id="137">тот самый</a> написал:<br />1. по понятным причинам, не ручаюсь на 100% но, код работы с коллбеками, завязан на отдельный LUA-поток в контексте одной виртуальной машины. Другой поток (и физический и LUA-поток) - это, ещё один коллбек - функция &quot;main&quot;.<br />Таким образом, никаких проблем там - уже давно не возникает.<br /><br />=============<br />Можно ещё разок. Я не понял, что Вы имеете ввиду.<br /><br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_RCVWpG0u" href="/user/137/" bx-tooltip-user-id="137">тот самый</a> написал:<br />2. любой доступ к глобальным переменным - обёрнут критическими секциями. Это уже было сказано Михаилом Булычевым. Строго говоря, такие вопросы Вам - и надо ему задавать, а не &quot;бодаться&quot; с другими.<br />=============<br />Случайно нет ссылки на то, что этот человек сказал и кто этот человек?<br /><br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_PU6he13X" href="/user/62/" bx-tooltip-user-id="62">Николай  Камынин</a> написал:<br />все решается с помощью одного event,<br /> функций sinsert &nbsp;и sremove <br />и использованием глобальных переменных.<br />=============<br />Мне сложно Вам отвечать, т.к., возможно, Вы либо не понимаете, как устроен многопоточный доступ к Си данным lua_State, либо, в чём отличие Event (созданного с помощью CreateEvent) от критической секции (мьютекса). <br />
			<i>23.03.2016 11:39:43, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14413/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14413/topic1464/</guid>
			<pubDate>Wed, 23 Mar 2016 11:39:43 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13935/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_5AsUDpxV" href="/user/62/" bx-tooltip-user-id="62">Николай  Камынин</a> написал:<br /><br />====quote====<br /> тот самый &nbsp; написал:<br /><br />====quote====<br /> Николай &nbsp;Камынин &nbsp; написал:<br />почему LUA-поток - сродни корутинам.<br />это и есть корутины других луа потоков я не знаю а Вы?<br />=============<br />сумничал, что ль?<br />=============<br />т е сам не знаешь что сказал? Бывает, не переживайте.<br />=============<br />я сказал - лишь то, что написано. А ты - только троллишь и убиваешь темы.<br />корутины - это не LUA-потоки. В LUA - корутины используют LUA-потоки - НО! Это не LUA-потоки. И уж тем более - НЕ - потоки ОС. <br />
			<i>12.03.2016 14:06:04, тот самый.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13935/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13935/topic1464/</guid>
			<pubDate>Sat, 12 Mar 2016 14:06:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13934/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_dQ9NG2Mq" href="/user/137/" bx-tooltip-user-id="137">тот самый</a> написал:<br /><br />====quote====<br /> Николай &nbsp;Камынин &nbsp; написал:<br />почему LUA-поток - сродни корутинам.<br />это и есть корутины других луа потоков я не знаю а Вы?<br />=============<br />сумничал, что ль?<br />=============<br />т е сам не знаешь что сказал? Бывает, не переживайте. <br />
			<i>12.03.2016 08:30:27, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13934/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13934/topic1464/</guid>
			<pubDate>Sat, 12 Mar 2016 08:30:27 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13928/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_r2REdsU4" href="/user/62/" bx-tooltip-user-id="62">Николай  Камынин</a> написал:<br />почему LUA-поток - сродни корутинам.<br />это и есть корутины других луа потоков я не знаю а Вы?<br />=============<br />сумничал, что ль? <br />
			<i>11.03.2016 19:22:08, тот самый.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13928/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13928/topic1464/</guid>
			<pubDate>Fri, 11 Mar 2016 19:22:08 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13926/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_KKa18pzB" href="/user/137/" bx-tooltip-user-id="137">тот самый</a> написал:<br /><br />====quote====<br /> Вячеслав &nbsp; написал:<br />Да, создаются 2 системных потока, да, в каждом из них выполняется lua_pcall<br />=============<br />Всегда, при разговоре на эту тему - разделяйте понятия:<br />системный поток - это НЕ LUA-поток, а поток ОС<br />LUA-поток - это не поток ОС. LUA-поток - сродни корутинам.<br /><br />В самой LUA - никакие системные потоки - не создаются<br />=============<br />почему LUA-поток - сродни корутинам.<br />это и есть корутины других луа потоков я не знаю а Вы? <br />
			<i>11.03.2016 18:53:49, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13926/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13926/topic1464/</guid>
			<pubDate>Fri, 11 Mar 2016 18:53:49 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13882/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_K8je0AjI" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br />Да, создаются 2 системных потока, да, в каждом из них выполняется lua_pcall<br />=============<br />Всегда, при разговоре на эту тему - разделяйте понятия:<br />системный поток - это НЕ LUA-поток, а поток ОС<br />LUA-поток - это не поток ОС. LUA-поток - сродни корутинам.<br /><br />В самой LUA - никакие системные потоки - не создаются <br />
			<i>11.03.2016 10:28:05, тот самый.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13882/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13882/topic1464/</guid>
			<pubDate>Fri, 11 Mar 2016 10:28:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13881/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_uRQ0l0JO" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br />если выполнение потока main будет приостановлено системным планировщиком на середине выполнения Lua-команды (luaV_execute) и в этот момент начнёт выполняться основной поток Quik, который захочет вызвать наш callback, то основной поток Quik будет ждать на lua_lock операции (планировщик переключит выполнение на другой поток вместо основного потока Quik), т. к. поток main в данный момент владеет мьютексом, который предотвращает одновременное выполнение двух Lua-комманд из разных потоков.<br />=============<br />1. по понятным причинам, не ручаюсь на 100% но, код работы с коллбеками, завязан на отдельный LUA-поток в контексте одной виртуальной машины. Другой поток (и физический и LUA-поток) - это, ещё один коллбек - функция &quot;main&quot;.<br />Таким образом, никаких проблем там - уже давно не возникает.<br />2. любой доступ к глобальным переменным - обёрнут критическими секциями. Это уже было сказано Михаилом Булычевым. Строго говоря, такие вопросы Вам - и надо ему задавать, а не &quot;бодаться&quot; с другими. <br />
			<i>11.03.2016 10:21:20, тот самый.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13881/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13881/topic1464/</guid>
			<pubDate>Fri, 11 Mar 2016 10:21:20 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13864/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			все решается с помощью одного event,<br /> функций sinsert &nbsp;и sremove <br />и использованием глобальных переменных. <br />
			<i>11.03.2016 06:51:42, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13864/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13864/topic1464/</guid>
			<pubDate>Fri, 11 Mar 2016 06:51:42 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13863/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			причем лишь запись данных. <br />
			<i>11.03.2016 06:48:11, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13863/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13863/topic1464/</guid>
			<pubDate>Fri, 11 Mar 2016 06:48:11 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13862/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_lleQw1KX" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br /><br />====quote====<br />которые как раз и вызывают функции из lapi.c<br />=============<br />имеется ввиду, что функции из lapi.c вызывают внутренние функции в библиотеке Lua, и их же вызывает luaV_execute напрямую. Например, &nbsp;<noindex><a href="http://www.lua.org/source/5.1/lapi.c.html#lua_settable" target="_blank" rel="nofollow">lua_settable</a></noindex> &nbsp;вызывает &nbsp;<noindex><a href="http://www.lua.org/source/5.1/lvm.c.html#luaV_settable" target="_blank" rel="nofollow">luaV_settable</a></noindex> , которую напрямую (через макрос) вызывает luaV_execute.<br />=============<br />Причем здесь вызов функций? <br />Синхронизировать надо обращение к данным, а не к коду функций.<br />Вы что-то путаете. <br />
			<i>11.03.2016 06:47:09, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13862/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13862/topic1464/</guid>
			<pubDate>Fri, 11 Mar 2016 06:47:09 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13859/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br />которые как раз и вызывают функции из lapi.c<br />=============<br />имеется ввиду, что функции из lapi.c вызывают внутренние функции в библиотеке Lua, и их же вызывает luaV_execute напрямую. Например, <noindex><a href="http://www.lua.org/source/5.1/lapi.c.html#lua_settable" target="_blank" rel="nofollow">lua_settable</a></noindex> вызывает <noindex><a href="http://www.lua.org/source/5.1/lvm.c.html#luaV_settable" target="_blank" rel="nofollow">luaV_settable</a></noindex>, которую напрямую (через макрос) вызывает luaV_execute. <br />
			<i>11.03.2016 00:26:44, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13859/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13859/topic1464/</guid>
			<pubDate>Fri, 11 Mar 2016 00:26:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13858/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_oSX1t7vE" href="/user/82/" bx-tooltip-user-id="82">swerg</a>, давайте по порядку.<br />Чтобы вызвать любую Lua-функцию из Си-кода нужно вызвать lua_call или lua_pcall. Остановлюсь на втором методе, т.к. именно его использует Quik для вызова main, всех callback'ов и загрузки скрипта (через Lua-функцию require или dofile).<br />Вызов lua_pcall выполняет lua_lock. Также напомню, что lua_lock / lua_unlock работают с одной и той же критической секцией, которая обслуживает сразу два потока (main и callback'ов), поэтому, если в другом потоке эта критическая секция будет заблокирована, то поток, вызывающий lua_lock, будет ждать её освобождения.<br />Итак, в <noindex><a href="http://www.lua.org/source/5.1/lapi.c.html#lua_pcall" target="_blank" rel="nofollow">lua_pcall</a></noindex> мы блокируем нашу критическую секцию lua_lock, затем по цепочке вызовов lua_pcall -&gt; <noindex><a href="http://www.lua.org/source/5.1/ldo.c.html#luaD_pcall" target="_blank" rel="nofollow">luaD_pcall</a></noindex> -&gt; <noindex><a href="http://www.lua.org/source/5.1/ldo.c.html#luaD_rawrunprotected" target="_blank" rel="nofollow">luaD_rawrunprotected</a></noindex> -&gt; <noindex><a href="http://www.lua.org/source/5.1/luaconf.h.html#LUAI_TRY" target="_blank" rel="nofollow">LUAI_TRY</a></noindex> (этот макрос вызывает на самом деле <noindex><a href="http://www.lua.org/source/5.1/lapi.c.html#f_call" target="_blank" rel="nofollow">f_call</a></noindex> - см. параметр ф-ции luaD_rawrunprotected) -&gt; <noindex><a href="http://www.lua.org/source/5.1/ldo.c.html#luaD_call" target="_blank" rel="nofollow">luaD_call</a></noindex> -&gt; мы наконец попадаем в <noindex><a href="http://www.lua.org/source/5.1/lvm.c.html#luaV_execute" target="_blank" rel="nofollow">luaV_execute</a></noindex> (в случае, если наша функция - это Lua-функция). Замечу, что всё это время мы удерживаем критическую секцию (lua_lock).<br />Освободить критическую секцию, пока выполяется luaV_execute мы можем по трём причинам (см. код <noindex><a href="http://www.lua.org/source/5.1/lvm.c.html#luaV_execute" target="_blank" rel="nofollow">luaV_execute</a></noindex>):<br />1. <noindex><a href="http://www.lua.org/source/5.1/lvm.c.html#dojump" target="_blank" rel="nofollow">dojump</a></noindex> использует luai_threadyield, который позволяет переключиться на выполнение другого потока,<br />2. <noindex><a href="http://www.lua.org/source/5.1/ldo.c.html#luaD_precall" target="_blank" rel="nofollow">luaD_precall</a></noindex> в случае вызова Си-функции из Lua-функции (например Sleep),<br />3. <noindex><a href="http://www.lua.org/source/5.1/lvm.c.html#traceexec" target="_blank" rel="nofollow">traceexec</a></noindex> выполняется на каждой итерации LuaVM и, в случае если установлен debug.sethook, <noindex><a href="http://www.lua.org/source/5.1/ldo.c.html#luaD_callhook" target="_blank" rel="nofollow">luaD_callhook</a></noindex> выполнит lua_unlock / lua_lock.<br /><br />Также замечу, что LuaVM (luaV_execute) не использует LuaAPI (функции из <noindex><a href="http://www.lua.org/source/5.1/lapi.c.html" target="_blank" rel="nofollow">lapi.c</a></noindex>) для доступа к переменным. LuaVM использует внутренние функции (которые как раз и вызывают функции из lapi.c) напрямую - без блокировки критической секции (lua_lock / lua_unlock), потому что, когда выполняется luaV_execute, критическая секция уже заблокирована.<br /><br />Да, создаются 2 системных потока, да, в каждом из них выполняется lua_pcall, который приводит к вызову luaV_execute, но пока выполняется код самой luaV_execute, код в другом потоке ждёт на lua_lock или выполняет что-нибудь другое.<br /><br />P.S. Теоритически, чтобы заставить LuaVM долго не отпускать критическую секцию нужно выполнить debug.sethook(nil), а затем выполнять в одном из потоков линейный Lua-код, который не приведёт к вызову <noindex><a href="http://www.lua.org/source/5.1/lvm.c.html#dojump" target="_blank" rel="nofollow">dojump</a></noindex>. <br />
			<i>11.03.2016 00:21:19, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13858/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13858/topic1464/</guid>
			<pubDate>Fri, 11 Mar 2016 00:21:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13856/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Собственно исходники ведь доступны.<br />Где в коде luaV_execute есть lua_lock? покажите<br /><br />И совсем другое дело функции доступа к &quot;переменным&quot;, например:<br /><noindex><a href="http://www.lua.org/source/5.1/lapi.c.html#lua_settable" target="_blank" rel="nofollow">http://www.lua.org/source/5.1/lapi.c.html#lua_settable</a></noindex><br /><br />Зачем вы всё время фантазируете, ничего не проверяя, вот что не понятно. <br />
			<i>10.03.2016 21:31:23, swerg.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13856/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13856/topic1464/</guid>
			<pubDate>Thu, 10 Mar 2016 21:31:23 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13855/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Вячеслав,<br />у вас есть пруф подтверждающий то, что вы сейчас написали, или это ваши фантазии?<br />Как-то всё очень сомнительно выглядит, особенно вот это<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_oR5ZsFIG" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br />и в этот момент начнёт выполняться основной поток Quik, который захочет вызвать наш callback, то основной поток Quik будет ждать на lua_lock операции<br />=============<br /> <br />
			<i>10.03.2016 21:19:17, swerg.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13855/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13855/topic1464/</guid>
			<pubDate>Thu, 10 Mar 2016 21:19:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13843/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_0NkNasKR" href="/user/82/" bx-tooltip-user-id="82">swerg</a> написал:<br />И да, код в смысле Lua-программы прерывается в реализованном случае вовсе не обязательно &quot;между операторами Lua&quot;. Прерваться код может и &quot;посередине выполнения одного из операторов&quot;.<br />=============<br />Да, выполнение любого потока может прерваться в любом месте. Что я имею ввиду, так это то, что 2 Lua-команды (из потока main и потока callback'а) одновременно выполняться не могут: если выполнение потока main будет приостановлено системным планировщиком на середине выполнения Lua-команды (luaV_execute) и в этот момент начнёт выполняться основной поток Quik, который захочет вызвать наш callback, то основной поток Quik будет ждать на lua_lock операции (планировщик переключит выполнение на другой поток вместо основного потока Quik), т. к. поток main в данный момент владеет мьютексом, который предотвращает одновременное выполнение двух Lua-комманд из разных потоков. <br />
			<i>10.03.2016 13:42:41, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13843/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13843/topic1464/</guid>
			<pubDate>Thu, 10 Mar 2016 13:42:41 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13842/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_RMClp7v4" href="/user/137/" bx-tooltip-user-id="137">тот самый</a>,<br />Положим, я называю критические секции <noindex><a href="https://ru.wikipedia.org/wiki/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81" target="_blank" rel="nofollow">мьютексами</a></noindex>.<br />В чём заключается Ваше предложение? <br />
			<i>10.03.2016 13:34:38, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13842/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13842/topic1464/</guid>
			<pubDate>Thu, 10 Mar 2016 13:34:38 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13824/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_ic5bk5aa" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br />Предполагаю, что QLua использует отладочные функции debug.sethook для перехвата управления и переключения Lua VM c потока main на поток callback'ов.<br /><br />=============<br />В QLua используются реальные разные потоки операционной системы Windows.<br />Потоки переключает Windows, где реализована вытесняющая мультизадачность. Бесконечные циклы не мешают Windows переключать процессор между исполнением кода разных потоков, никакая Lua VM тут ни при чем.<br />Что вы еще пытаетесь найти в Lua VM?<br /><br />И да, код в смысле Lua-программы прерывается в реализованном случае вовсе не обязательно &quot;между операторами Lua&quot;. Прерваться код может и &quot;посередине выполнения одного из операторов&quot;. <br />
			<i>10.03.2016 06:18:03, swerg.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13824/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13824/topic1464/</guid>
			<pubDate>Thu, 10 Mar 2016 06:18:03 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13808/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_tFLibIBM" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br />В таком случае, лишь одна команда Lua VM выполняется атомарно<br />=============<br />забавно слушать рассуждения об атомарности в данном контексте..)) <br />
			<i>09.03.2016 17:18:48, тот самый.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13808/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13808/topic1464/</guid>
			<pubDate>Wed, 09 Mar 2016 17:18:48 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13807/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			макросы lua_lock и lua_unlock - уже давно реализованы через критические секции. Так советовалось ещё на страницах &quot;lua-users wiki&quot;, а также не раз подтверждалось самими разработчиками. Использование мьютексов конкретно в данном контексте - т.е. как замена критическим секциям в вышеуказанных макросах - глупая идея. Что - тоже не раз уже упоминалось.<br /><br />Более того, на страницах форума уже было расписано во всех деталях все тонкости реализации многопоточности в квике - пользуйтесь гуглом и обрящите. <br />
			<i>09.03.2016 17:14:05, тот самый.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13807/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13807/topic1464/</guid>
			<pubDate>Wed, 09 Mar 2016 17:14:05 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13802/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_UhFYQ7wL" href="/user/82/" bx-tooltip-user-id="82">swerg</a>, проверил. Подтверждаю слова <a class="blog-p-user-name" id="bp_C3JSQ0RU" href="/user/17/" bx-tooltip-user-id="17">Sergey Gorokhov.</a><br /><br />Предполагаю, что QLua использует отладочные функции debug.sethook для перехвата управления и переключения Lua VM c потока main на поток callback'ов.<br />Других варинтов не вижу, как можно (без переписывания самого движка Lua) переключить Lua VM на выполнение другого потока даже в случае бесконечного цикла 
====code====
<pre>while(true) do end</pre>
=============
(кроме того, нашёл код в Lua: lvm.c макрос dojump, который как раз и будет выполняться в случае с безусловным переходом, и который выполняет unlock / lock, поэтому бесконечный цикл точно не заблокирует Lua VM навсегда, а с использованием debug.sethook заблокировать Lua VM навсегда в принципе становится невозможно)<br /><br />В таком случае, лишь одна команда Lua VM выполняется атомарно, а затем может произойти переключение на выполнение другого Lua потока. Отсюда следует, что использование библиотеки, реализующей API доступа к системным мьютексам (или критическим секциям, как будет угодно), будет вполне оправдано для разграничения доступа к глобальным Lua таблицам.<br /><br />Не ожидаю увидеть заметную потерю производительности в этом случае, т.к. QLua на каждую Lua команду выполняет unlock / lock мьютекса, ограничевающего доступ к Lua VM (через обращение к callback'у, установленному с помощью debug.sethook). <br />
			<i>09.03.2016 16:32:56, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13802/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13802/topic1464/</guid>
			<pubDate>Wed, 09 Mar 2016 16:32:56 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13558/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_CWiCfY0t" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br /><br />====quote====<br /> <br />=============<br />Я не понял контекст вашего оригинального сообщения. Есть просто термин &nbsp;<noindex><a href="https://ru.wikipedia.org/wiki/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81" target="_blank" rel="nofollow">мьютекс</a></noindex> , есть &nbsp;<noindex><a href="http://ru.cppreference.com/w/cpp/thread/mutex" target="_blank" rel="nofollow">std::mutex</a></noindex> &nbsp;(или &nbsp;<noindex><a href="http://en.cppreference.com/w/cpp/thread/recursive_mutex" target="_blank" rel="nofollow">std::recursive_mutex</a></noindex> &nbsp;- по сути реализованые через аналог критических секций на уровне Concurrency namespace'а в MS CRT), и есть &nbsp;<noindex><a href="https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682411(v=vs.85).aspx" target="_blank" rel="nofollow">WinAPI mutex</a></noindex> , который может использоваться несколькими процессами сразу. В первом сообщении я сразу упомянул, что имею ввиду std::recursive_mutex или критические секции, а дальше уже оба варианта называл просто &quot;мьютексом&quot;, чтобы не писать одно и то же по нескольку раз.<br />=============<br />судя по ответу для Вас не имеет разницы мьютекс и критическая секция.<br />Но основное их отличие - это быстродействие. <br />у мьютексов малое,<br /> у критических секций -высокое (согласно Рихтеру)<br />-----------------------------------------<br />мьютекс - это полноценный объект ядра, поэтому он и медленный<br />его имеет смысл применять, если надо синхронизировать потоки различных процессов.<br />в данном случае процесс один. <br />Поэтому надобность в мьютексе не очевидна. вернее сказать избыточна.<br />------------------------------------------------------<br />Зачем из пушки стрелять по воробьям.<br />Но это я так для дискуссии, <br />типа если мьтексом обозвать все, <br />то я применяю 5 мьютексов, <br />которые в действительности 4 &nbsp;interlocked-функции и 1 event.<br />----------------------------<br />Поэтому применение мьютексов излишне в КВИКЕ. &nbsp; <br />
			<i>02.03.2016 23:14:36, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13558/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13558/topic1464/</guid>
			<pubDate>Wed, 02 Mar 2016 23:14:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13557/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_qMJkMCup" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br />Я прав?<br />=============<br />Казалось бы, это элементарно проверить.<br />Но вам нравится фантазировать. Не буду мешать. <br />
			<i>02.03.2016 21:54:11, swerg.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13557/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13557/topic1464/</guid>
			<pubDate>Wed, 02 Mar 2016 21:54:11 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13519/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_di8NK0sI" href="/user/62/" bx-tooltip-user-id="62">Николай  Камынин</a> написал:<br /><br />====quote====<br /> Вячеслав &nbsp; написал:<br /><br />====quote====<br /> Николай &nbsp;Камынин &nbsp; написал:<br />У меня вопрос к автору темы.<br />А зачем использовать мьютекс, если у нас один процесс?<br />Спасибо<br />=============<br />Даже не знаю с чего начать. В Windows &quot;процесс&quot; - это контейнер, в котором выполняются потоки (нити). Потоки имеют состояние выполнения, которое включает регистры процессора и стек. Адресное пространство (память) у потоков одного процесса общая. Для синхронизации доступа к ресурсам, которые используются несколькими потоками используют мьютексы.<br />=============<br />Я собственно спросил зачем мьютекс если один процесс, <br />в том плане, <br />что в одном процессе синхронизацию потоков эффективнее делать другими средствами<br /> либо в пользовательском режиме -атомарным операциями и критическими секциями<br /> либо ядерными - событиями. <br />Это быстрее , чем мьютекс.<br />=============<br />Я не понял контекст вашего оригинального сообщения. Есть просто термин <noindex><a href="https://ru.wikipedia.org/wiki/%D0%9C%D1%8C%D1%8E%D1%82%D0%B5%D0%BA%D1%81" target="_blank" rel="nofollow">мьютекс</a></noindex>, есть <noindex><a href="http://ru.cppreference.com/w/cpp/thread/mutex" target="_blank" rel="nofollow">std::mutex</a></noindex> (или <noindex><a href="http://en.cppreference.com/w/cpp/thread/recursive_mutex" target="_blank" rel="nofollow">std::recursive_mutex</a></noindex> - по сути реализованые через аналог критических секций на уровне Concurrency namespace'а в MS CRT), и есть <noindex><a href="https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682411(v=vs.85).aspx" target="_blank" rel="nofollow">WinAPI mutex</a></noindex>, который может использоваться несколькими процессами сразу. В первом сообщении я сразу упомянул, что имею ввиду std::recursive_mutex или критические секции, а дальше уже оба варианта называл просто &quot;мьютексом&quot;, чтобы не писать одно и то же по нескольку раз. <br />
			<i>02.03.2016 10:20:14, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13519/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13519/topic1464/</guid>
			<pubDate>Wed, 02 Mar 2016 10:20:14 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13518/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_4brM1kXs" href="/user/17/" bx-tooltip-user-id="17">Sergey Gorokhov</a> написал:<br /><br />====quote====<br /> Вячеслав &nbsp; написал:<br />Поэтому же Quik можно подвесить простым кодомКодwhile (true) do end<br />Поставив его, например, в main и пусть в этот момент Quik захочет вызвать какой-нибудь callback.<br />В результате, Quik зависнит<br />=============<br />нет не зависнет<br />=============<br />Тогда в какой момент произойдёт переключение выполнения потока main на выполнение callback'а? Ведь в main таким кодом мы монопольно занимаем Lua VM. <br />
			<i>02.03.2016 10:13:28, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13518/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13518/topic1464/</guid>
			<pubDate>Wed, 02 Mar 2016 10:13:28 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13513/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_CgUI4wgd" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br /><br />====quote====<br /> Николай &nbsp;Камынин &nbsp; написал:<br />У меня вопрос к автору темы.<br />А зачем использовать мьютекс, если у нас один процесс?<br />Спасибо<br />=============<br />Даже не знаю с чего начать. В Windows &quot;процесс&quot; - это контейнер, в котором выполняются потоки (нити). Потоки имеют состояние выполнения, которое включает регистры процессора и стек. Адресное пространство (память) у потоков одного процесса общая. Для синхронизации доступа к ресурсам, которые используются несколькими потоками используют мьютексы.<br />=============<br />Я собственно спросил зачем мьютекс если один процесс, <br />в том плане, <br />что в одном процессе синхронизацию потоков эффективнее делать другими средствами<br /> либо в пользовательском режиме -атомарным операциями и критическими секциями<br /> либо ядерными - событиями. <br />Это быстрее , чем мьютекс. <br />
			<i>02.03.2016 08:48:58, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13513/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13513/topic1464/</guid>
			<pubDate>Wed, 02 Mar 2016 08:48:58 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13508/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_4bcVpIkV" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав</a> написал:<br />Поэтому же Quik можно подвесить простым кодомКодwhile (true) do end<br />Поставив его, например, в main и пусть в этот момент Quik захочет вызвать какой-нибудь callback.<br />В результате, Quik зависнит<br />=============<br /><br />нет не зависнет <br />
			<i>01.03.2016 23:39:04, Sergey Gorokhov.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13508/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13508/topic1464/</guid>
			<pubDate>Tue, 01 Mar 2016 23:39:04 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13507/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_0WlebJhj" href="/user/82/" bx-tooltip-user-id="82">swerg</a>,<br />Подытожу: в Lua переключение потоков (глобального на main и обратно) происходит только в момент вызова любой Си функции (любой библиотечной функции). В остальное время, если Lua-код выполняется, то он выполняется атомарно. Поэтому же Quik можно подвесить простым кодом
====code====
<pre>while (true) do end
</pre>
=============
Поставив его, например, в main и пусть в этот момент Quik захочет вызвать какой-нибудь callback.<br />В результате, Quik зависнит на lua_lock Си функции, т.к. Lua VM будет в этот момент занята потоком main, выполняющим наш бесконечный цикл.<br /><br />Я прав? <br />
			<i>01.03.2016 23:29:31, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13507/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13507/topic1464/</guid>
			<pubDate>Tue, 01 Mar 2016 23:29:31 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13506/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_F0WMQKsj" href="/user/62/" bx-tooltip-user-id="62">Николай  Камынин</a> написал:<br />У меня вопрос к автору темы.<br />А зачем использовать мьютекс, если у нас один процесс?<br />Спасибо<br />=============<br />Даже не знаю с чего начать. В Windows &quot;процесс&quot; - это контейнер, в котором выполняются потоки (нити). Потоки имеют состояние выполнения, которое включает регистры процессора и стек. Адресное пространство (память) у потоков одного процесса общая. Для синхронизации доступа к ресурсам, которые используются несколькими потоками используют мьютексы. <br />
			<i>01.03.2016 23:24:54, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13506/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13506/topic1464/</guid>
			<pubDate>Tue, 01 Mar 2016 23:24:54 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>std::recursive_mutex и cинхронизация потоков в Lua</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message13505/topic1464/">std::recursive_mutex и cинхронизация потоков в Lua</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_rLZ5fD9T" href="/user/82/" bx-tooltip-user-id="82">swerg</a> написал:<br />Вы так пишете, как-будто есть другие способы.<br />Про это уже писалось (на старом форуме, как водится).<br />=============<br />Меня не было на старом форуме, поэтому не знаю. <br />
			<i>01.03.2016 23:21:15, Вячеслав.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message13505/topic1464/</link>
			<guid>http://forum.quik.ru/messages/forum10/message13505/topic1464/</guid>
			<pubDate>Tue, 01 Mar 2016 23:21:15 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
