Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Атомарен ли TThread.Synchronize ? 
:(
    Опции темы
Gershkovich
Дата 3.3.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: 0
Всего: 2



Всем привет!

Скажите может ли быть такая ситуация:

VCL поток выполняет метод А некоторое время
В этот момент другой поток вызывает метод Synchronize(B)
Т.е.  VCL поток должен выполнить метод В

Так вот вопрос : Выполнится ли метод А до конца 
или возможна ситуация когда выполнение А приостанавливается
затем выполняется В, и снова возвращается в А ?

Заранее спасибо.

PM MAIL   Вверх
Alexeis
Дата 3.3.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Вот чего говорит наш великий мануал о потоках в делфи
Цитата

Ограничения Synchronize.

У метода Synchronize есть несколько недостатков, благодаря которым он подходит лишь для простых многопоточных приложений.

    * Synchronize полезен лишь при взаимодействии между рабочим потоком и основным потоком VCL.
    * Использование Synchronize подразумевает,что рабочий поток ждет, пока основной поток VCL будет в состоянии ожидания, даже когда это не так уж и необходимо.
    * Если приложение часто использует Synchronize, главный поток VCL становится "узким местом", и возникают проблемы с производительностью.
    * Если Synchronize используется для непосредственного взаимодействия двух рабочих потоков, оба они могут быть приостановлены, ожидая главный поток.
    * Synchronize может вызвать зацикливание, если главный поток VCL ожидает другие потоки.

Правда, у Synchronize есть и одно преимущество над другими механизмами синхронизации:

    * В методе, вызываемом с помощью Synchronize, может быть любой код, в том числе и потоко-небезопасный код VCL.


  Т.е. работать оно будет, но не самым эффективным образом.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Poseidon
Дата 3.3.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Так, стоп! Метод Synchronize используется для безопасного вызова методов VCL внутри потоков. Т.е. если "другой поток" выполняет Synchronize(B), то B выполнится в рамках этого "другого" потока, и никак не отразится на работе потока А., т.е. А в, этом случае, выполнится до конца.



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
VICTAR
Дата 3.3.2008, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



Насколько я знаю
Цитата(Gershkovich @  3.3.2008,  15:57 Найти цитируемый пост)
выполнение А приостанавливается
затем выполняется В, и снова возвращается в А


PM MAIL   Вверх
Poseidon
Дата 3.3.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



VICTAR, я вот так понял: у нас 2 потока и 2 метода. Каждый метод выполняется в своем потоке. С какого перепугу один из них будет останавливаться?  smile 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
VICTAR
Дата 3.3.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1108
Регистрация: 6.10.2006

Репутация: 37
Всего: 80



А я понял, что у нас один главный VCL поток и один "другой" поток.
ЗЫ я ничего не утверждаю, просто высказал свое предположение.
PM MAIL   Вверх
Gershkovich
Дата 3.3.2008, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: 0
Всего: 2



Poseidon, насколько я понимаю Synchronize, оба метода выполняются в главном потоке
"Другой поток" просто просит главный выполнить метод В и ждет пока главный не выполнит этот метод.

VICTAR прав

Это сообщение отредактировал(а) Gershkovich - 3.3.2008, 16:28
PM MAIL   Вверх
Rennigth
Дата 3.3.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 49
Всего: 76



Цитата(Poseidon @  3.3.2008,  16:23 Найти цитируемый пост)
VICTAR, я вот так понял: у нас 2 потока и 2 метода. Каждый метод выполняется в своем потоке. С какого перепугу один из них будет останавливаться?    

Assign a method to WakeMainThread before calling a thread’s Synchronize method. When you call a thread’s Synchronize method, it calls the method assigned to WakeMainThread once it has obtained a lock on the main GUI thread. This allows other threads to quickly synchronize with the GUI thread even if no events are being processed due to an idle state.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
MetalFan
Дата 3.3.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Alexeis же во втором посте все написал. что тут еще за гадания на кофейной гуще? )


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Gershkovich
Дата 4.3.2008, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 243
Регистрация: 8.2.2006

Репутация: 0
Всего: 2



Экспериментальным путем было установлено, что ни один из методов
не прерывается.
Т.е. метод В не начнется пока не закончится А и наооборот
PM MAIL   Вверх
MetalFan
Дата 4.3.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Gershkovich, это из кода VCL ясно)



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
dumb
Дата 4.3.2008, 14:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



запутали бедолагу. smile аж опыты вынудили проводить...

Цитата(Gershkovich @  4.3.2008,  12:15 Найти цитируемый пост)
метод В не начнется пока не закончится А и наооборот
все верно. 
еще разок, для закрепления: Synchronize просто добавляет адрес переданного ему метода в глобальный список, который проверяется главным потоком - если есть элемент, то происходит вызов процедуры(адрес которой содержится в элементе) в контексте главного потока. по окончании выполнения этой процедуры главный поток сигнализирует рабочему потоку, вызвавшему Synchronize, что можно продолжать работать.

т.е. никаких выполнений "вперемешку" нет - все происходит в контексте главного потока "в порядке общей очереди". smile
PM MAIL   Вверх
GrigorievAnton
Дата 4.3.2008, 19:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.3.2008

Репутация: нет
Всего: нет



На самом деле такая ситуация возможна, если метод A вызывает Application.ProcessMessages - Application.ProcessMesages проверяет очередь синхронизированных методов и выполняет первый из неё. Если не вызывает - то действительно в порядке общей очереди.
PM MAIL   Вверх
MetalFan
Дата 5.3.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



не вижу смысла вызова ProcessMessages в синхронизируемой функции. хотя что только в голову людям не придет)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Alexeis
Дата 5.3.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(MetalFan @  5.3.2008,  09:34 Найти цитируемый пост)
не вижу смысла вызова ProcessMessages в синхронизируемой функции

  С таким же успехом можно досрочно выйти из критической секции или сигнализировать семафор, но это просто глупо в данной ситуации.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0605 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.