На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Синхронизация доступа к переменным в потоке., Есть несколько потоков, надо использовать одну переменную во всех.
    В С++ есть модификатор volatile, а в дельфи аналог этого модификатора есть? В проекте одна переменная записывается в потоке, а другие потоки эту переменную читают. Чтобы не было одновременного доступа к переменной существуют ли в дельфи какие то средства синхронизации, или нет. Или надо пользоваться мьютексами?
      volatile не защищает от одновременного доступа к переменной, он лишь гарантирует, что в каждый момент существует только одна копия переменной. Если переменная простая, чтение её атомарное, то этого может быть достаточно для обеспечения корректного поведения.

      В Delphi для Windows volatile нет (для других платформ предусмотрено, не знаю, реализовано ли). Компилятор Delphi не оптимизирует обращения к переменным из разных процедур, размещая их в регистрах, так что простая схема - один раз прочитал переменную в копию, и используй, аналогично с записью, тоже дает защиту от неожиданных изменений при определенных сценариях. При необходимости можно читать с помощью IntelockedExchange. В более сложных случаях - критические секции.
        Я не понял про регистры. Дельфи может размещать переменные в регистрах и при выходе из функции (а переменная описана вне функции) значение теряется?
          Надо обработать переменную - прочитали ее в регистр, поработали, выгрузили назад. Серьезный оптимизирующий компилятор мог бы держать ее в регистре, пока она кому-то еще нужна, но дельфийский не таков.
            На х32 регистров так мало, что в реальных применениях это едва ли даст хоть какой-то выхлоп.
            Codero ergo sum
            // Программирую — значит, существую
              Цитата a_n_y_a @
              Или надо пользоваться мьютексами?


              Надо пользоваться мьютексами, критическими секциями и не разглагольствовать про регистры - в данном случае это ни к чему.
                Цитата a_n_y_a @
                Я не понял про регистры. Дельфи может размещать переменные в регистрах и при выходе из функции (а переменная описана вне функции) значение теряется?

                Нет, значения переменных не теряются. В регистры помещаются копии переменных.
                В Сях это соглашение о вызовах называется "fastcall". А в Delphi - "register". Но смысл один и тот же.

                Что касается синхронизации - тут тебе уже MBo ответил - либо семейство Interlocked - функций, либо критические секции.
                Кто рано встает, тому целый день спать хочется
                  Цитата a_n_y_a @
                  Надо обработать переменную - прочитали ее в регистр, поработали, выгрузили назад. Серьезный оптимизирующий компилятор мог бы держать ее в регистре, пока она кому-то еще нужна, но дельфийский не таков.
                  Причём тут вообще оптимизация и причём тут регистры? Delphi тоже держит локальные переменные в регистрах, но здесь они не локальные. Тем более, если это переменная, которая используется в нескольких потоках, то ни в каких регистрах она хранится не может даже в Си (у каждого потока свои значения регистров, которые с другими потоками никак не пересекаются).
                  В общем, работа через регистры не защитит переменную от влияния других потоков.

                  Другое дело, что эти Interlocked можно написать на ассемблере с префиксом lock (кроме xchg - она lock'а не требует, использует автоматически). Но если не знаешь как, то тогда Interlocked.
                  Добавлю, что Interlocked-функции есть смысл использовать только при единственном изменении (скажем, прочитать старое значение, одновременно записать новое или увеличить/уменьшить значение). В остальных случаях критические секции.
                  Ну ещё можно использовать запись и чтение из переменной - в это время другие потоки в неё ничего не запишут. Но только как разовую операцию (т.е. прочитать, изменить и записать обратно не прокатит - в этот процесс можно вклиниться). Нужно только убедиться, что переменная имеет размерность не более 32 бит или 64-х для 64-битного режима (иначе Delphi будет проводить данную операцию поэтапно, т.е. их будет 2 или более) и включено выравнивание {$A8}.

                  p.s. Если же задача в том, чтобы использовать одно ИМЯ переменной, но чтобы сами переменные были разные, то тут либо объявить её в классе потока, либо threadvar вместо var
                  vpmultishiftqb vscatterpf0dps vfmsubadd132pd vgatherpf1dps vpclmulhqlqdq vcmptrue_ussd vaeskeygenassist
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script Execution time: 0,1013 ]   [ 18 queries used ]   [ Generated: 20.11.19, 01:29 GMT ]