<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3741701</guid>
        <pubDate>Mon, 25 Sep 2017 05:27:57 +0000</pubDate>
        <title>Синхронизация доступа к переменным в потоке.</title>
        <link>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3741701</link>
        <description><![CDATA[Jin X: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411302&view=findpost&p=3740269'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>a_n_y_a &#064; <time class="tag-quote__quoted-time" datetime="2017-09-15T11:09:13+03:00">15.09.17, 08:09</time></span><div class='quote '>Надо обработать переменную - прочитали ее в регистр, поработали, выгрузили назад. Серьезный оптимизирующий компилятор мог бы держать ее в регистре, пока она кому-то еще нужна, но дельфийский не таков.</div></div>Причём тут вообще оптимизация и причём тут регистры? Delphi тоже держит локальные переменные в регистрах, но здесь они не локальные. Тем более, если это переменная, которая используется в нескольких потоках, то ни в каких регистрах она хранится не может даже в Си (у каждого потока свои значения регистров, которые с другими потоками никак не пересекаются).<br>
В общем, работа через регистры не защитит переменную от влияния других потоков.<br>
<br>
Другое дело, что эти Interlocked можно написать на ассемблере с префиксом lock (кроме xchg - она lock&#39;а не требует, использует автоматически). Но если не знаешь как, то тогда Interlocked.<br>
Добавлю, что Interlocked-функции есть смысл использовать только при единственном изменении (скажем, прочитать старое значение, одновременно записать новое или увеличить/уменьшить значение). В остальных случаях критические секции.<br>
Ну ещё можно использовать запись и чтение из переменной - в это время другие потоки в неё ничего не запишут. Но только как разовую операцию (т.е. прочитать, изменить и записать обратно не прокатит - в этот процесс можно вклиниться). Нужно только убедиться, что переменная имеет размерность не более 32 бит или 64-х для 64-битного режима (иначе Delphi будет проводить данную операцию поэтапно, т.е. их будет 2 или более) и включено выравнивание <strong class='tag-b'>{&#036;A8}</strong>.<br>
<br>
p.s. Если же задача в том, чтобы использовать одно ИМЯ переменной, но чтобы сами переменные были разные, то тут либо объявить её в классе потока, либо <strong class='tag-b'>threadvar</strong> вместо <strong class='tag-b'>var</strong>]]></description>
        <author>Jin X</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3741033</guid>
        <pubDate>Wed, 20 Sep 2017 21:57:53 +0000</pubDate>
        <title>Синхронизация доступа к переменным в потоке.</title>
        <link>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3741033</link>
        <description><![CDATA[Krid: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411302&view=findpost&p=3740313'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>a_n_y_a &#064; <time class="tag-quote__quoted-time" datetime="2017-09-15T10:50:38+00:00">15.09.17, 10:50</time></span><div class='quote '>Я не понял про регистры. Дельфи может размещать переменные в регистрах и при выходе из функции (а переменная описана вне функции) значение теряется? </div></div><br>
Нет, значения переменных не теряются. В регистры помещаются копии переменных. <br>
В Сях это соглашение о вызовах называется &quot;fastcall&quot;. А в Delphi - &quot;register&quot;. Но смысл один и тот же.<br>
<br>
Что касается синхронизации - тут тебе уже <strong class='tag-b'>MBo</strong> ответил - либо семейство Interlocked - функций, либо критические секции.]]></description>
        <author>Krid</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740529</guid>
        <pubDate>Mon, 18 Sep 2017 07:40:19 +0000</pubDate>
        <title>Синхронизация доступа к переменным в потоке.</title>
        <link>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740529</link>
        <description><![CDATA[ter_nk_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411302&view=findpost&p=3740269'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>a_n_y_a &#064; <time class="tag-quote__quoted-time" datetime="2017-09-15T08:09:13+00:00">15.09.17, 08:09</time></span><div class='quote '>Или надо пользоваться мьютексами?</div></div><br>
<br>
Надо пользоваться мьютексами, критическими секциями и не разглагольствовать про регистры - в данном случае это ни к чему.]]></description>
        <author>ter_nk_</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740527</guid>
        <pubDate>Mon, 18 Sep 2017 07:28:56 +0000</pubDate>
        <title>Синхронизация доступа к переменным в потоке.</title>
        <link>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740527</link>
        <description><![CDATA[Fr0sT: На х32 регистров так мало, что в реальных применениях это едва ли даст хоть какой-то выхлоп.]]></description>
        <author>Fr0sT</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740383</guid>
        <pubDate>Fri, 15 Sep 2017 15:33:19 +0000</pubDate>
        <title>Синхронизация доступа к переменным в потоке.</title>
        <link>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740383</link>
        <description><![CDATA[MBo: Надо обработать переменную - прочитали ее в регистр, поработали, выгрузили назад. Серьезный оптимизирующий компилятор мог бы держать ее в регистре, пока она кому-то еще нужна, но дельфийский не таков.]]></description>
        <author>MBo</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740313</guid>
        <pubDate>Fri, 15 Sep 2017 10:50:38 +0000</pubDate>
        <title>Синхронизация доступа к переменным в потоке.</title>
        <link>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740313</link>
        <description><![CDATA[a_n_y_a: Я не понял про регистры. Дельфи может размещать переменные в регистрах и при выходе из функции (а переменная описана вне функции) значение теряется?]]></description>
        <author>a_n_y_a</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740294</guid>
        <pubDate>Fri, 15 Sep 2017 09:35:02 +0000</pubDate>
        <title>Синхронизация доступа к переменным в потоке.</title>
        <link>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740294</link>
        <description><![CDATA[MBo: volatile не защищает от одновременного доступа к переменной, он лишь гарантирует, что в каждый момент существует только одна копия переменной. Если переменная простая, чтение её атомарное, то этого может быть достаточно для обеспечения корректного поведения.<br><br>В Delphi для Windows volatile нет (для других платформ предусмотрено, не знаю, реализовано ли). Компилятор Delphi не оптимизирует обращения к переменным из разных процедур, размещая их в регистрах, так что простая схема  - один раз прочитал переменную в копию, и используй, аналогично с записью, тоже дает защиту от неожиданных изменений при определенных сценариях. При необходимости можно читать с помощью IntelockedExchange. В более сложных случаях - критические секции.]]></description>
        <author>MBo</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740269</guid>
        <pubDate>Fri, 15 Sep 2017 08:09:13 +0000</pubDate>
        <title>Синхронизация доступа к переменным в потоке.</title>
        <link>https://forum.sources.ru/index.php?showtopic=411302&amp;view=findpost&amp;p=3740269</link>
        <description><![CDATA[a_n_y_a: В С++ есть модификатор volatile, а в дельфи аналог этого модификатора есть? В проекте одна переменная записывается в потоке, а другие потоки эту переменную читают. Чтобы не было одновременного доступа к переменной существуют ли в дельфи какие то средства синхронизации, или нет. Или надо пользоваться мьютексами?]]></description>
        <author>a_n_y_a</author>
        <category>Delphi: Система, Windows API</category>
      </item>
	
      </channel>
      </rss>
	