![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| bns12 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 7.5.2008 Репутация: нет Всего: нет |
Подскажите, пожалуйста, правильно ли я делаю:
1) я вставляю EnterCryticalSection первым оператором критической процедуры, к которой обращаюсь из нескольких потоков. Может быть, EnterCryticalSection нужно ставить перед командой потока, вызывающей эту процедуру? 2) я вставляю EnterCryticalSection первым оператором критической процедуры, к которой обращаюсь из нескольких потоков. При этом в процедуру передается параметр. При одновременном обращении к процедуре нескольких потоков параметры будут конфликтовать (затирать друг друга)? 3) я вставляю EnterCryticalSection первым оператором критической процедуры, к которой обращаюсь из нескольких потоков. Чтобы избежать зависания использую TryEnterCriticalSection:
Переменная Cnt будет общая для всех потоков или каждый поток работет со своей копией Cnt? Спасибо. |
|||
|
||||
| bems |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
-------------------- Обижено школьников: 8 |
||||
|
|||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Зависания чего ты пытаешь избежать? Если зависания потока, то это бессмысленно, т.к. если он будет ожидать, то не будут расходоваться ресурсы, а так он хоть и не сильно много, но все-таки их отжирает. Если это у тебя VCL поток, и ты пытаешься избежать зависания пользовательского интерфейса, то в цикле надо сделать Application.ProcessMessage.
Со своей копией. Она тоже в стеке потока. ЗЫЖ Вообще для входы/выходы из критических секций лучше всего в Try-Finally брать. ТАк... на всякий случай. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Нет. Эта переменная для менеджера памяти Delphi. К синхронизации она не имеет отношения. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
-------------------- Обижено школьников: 8 |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
Прошу прощения, как оказалось счетчик ссылок строки всегда обрабатывается атомарно, даже если есть всего один поток.
Но при передаче интерфейса в процедуру (а точнее при выходе из нее) все равно нужен IsMultiThread
-------------------- Обижено школьников: 8 |
|||
|
||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Ну, во-первых, ниче не понял. По подробнее можно? А во вторых, все, что ты говоришь, относится к менеджеру памяти и, вероятно, механизмам подсчета ссылок специфичным для делфи. А к синхронизации доступа к данным это отношения не имеет. Т.е. если два потока обращаются к одному ресурсу, неважно к какому, хоть десять раз IsMultiThread устанавливай, все равно нужна синхронизация. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: 31 Всего: 88 |
то что я говорю относиться к внутренним структурам данных менеджера памяти, доступ к которым осуществляется с использованием критической секции, которой влядеет менеджер памяти. Топикстартер спрашивал нормально ли будет сделать так: В этом коде действия, подставляемые компилятором после начала процедуры но до первой строки пользовательского кода (и после последней строки но до возврата из процедуры) выполняются вне критической секции пользователя. Значит нужно включить использование критической секции менеджера памяти с помощью IsMultiThread
задай вопрос конкретнее -------------------- Обижено школьников: 8 |
|||
|
||||
| Felan |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Ну и я о том же Полностью согласен.
Не понял, как звучит обратное утверждение? Мне кажется, что мы об одном и том же... Я лично не сталкивался с флагом IsMultiThread, только читал про него. Многопоточные приложения писал и пишу, но пользую TThread, поэтому не думаю об этом флаге. На вопрос топикастера ты ответил:
Я утверждаю, что установки этого флага не достаточно. Т.к. этот флаг будет отвечать за выделение памяти под данные из разных потоков, но не за доступ к ним. Доступ к ним надо синхронизировать отдельно. А в случае топикастера вообще все параллельно. У него данные только в стеке, так что для каждого потока свои будут -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
||||
|
|||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |