| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Использование CriticalSection |
| Автор: bns12 10.9.2008, 17:16 | ||
| Подскажите, пожалуйста, правильно ли я делаю: 1) я вставляю EnterCryticalSection первым оператором критической процедуры, к которой обращаюсь из нескольких потоков. Может быть, EnterCryticalSection нужно ставить перед командой потока, вызывающей эту процедуру? 2) я вставляю EnterCryticalSection первым оператором критической процедуры, к которой обращаюсь из нескольких потоков. При этом в процедуру передается параметр. При одновременном обращении к процедуре нескольких потоков параметры будут конфликтовать (затирать друг друга)? 3) я вставляю EnterCryticalSection первым оператором критической процедуры, к которой обращаюсь из нескольких потоков. Чтобы избежать зависания использую TryEnterCriticalSection:
Переменная Cnt будет общая для всех потоков или каждый поток работет со своей копией Cnt? Спасибо. |
| Автор: Felan 11.9.2008, 06:44 | ||||
Зависания чего ты пытаешь избежать? Если зависания потока, то это бессмысленно, т.к. если он будет ожидать, то не будут расходоваться ресурсы, а так он хоть и не сильно много, но все-таки их отжирает. Если это у тебя VCL поток, и ты пытаешься избежать зависания пользовательского интерфейса, то в цикле надо сделать Application.ProcessMessage.
Со своей копией. Она тоже в стеке потока. ЗЫЖ Вообще для входы/выходы из критических секций лучше всего в Try-Finally брать. ТАк... на всякий случай. |
| Автор: Felan 11.9.2008, 07:00 | ||
Нет. Эта переменная для менеджера памяти Delphi. К синхронизации она не имеет отношения. |
| Автор: bems 11.9.2008, 19:16 | ||
|
| Автор: bems 11.9.2008, 19:49 | ||
| Прошу прощения, как оказалось счетчик ссылок строки всегда обрабатывается атомарно, даже если есть всего один поток. Но при передаче интерфейса в процедуру (а точнее при выходе из нее) все равно нужен IsMultiThread
|
| Автор: Felan 12.9.2008, 07:44 | ||
Ну, во-первых, ниче не понял. По подробнее можно? А во вторых, все, что ты говоришь, относится к менеджеру памяти и, вероятно, механизмам подсчета ссылок специфичным для делфи. А к синхронизации доступа к данным это отношения не имеет. Т.е. если два потока обращаются к одному ресурсу, неважно к какому, хоть десять раз IsMultiThread устанавливай, все равно нужна синхронизация. |
| Автор: bems 12.9.2008, 17:13 | ||||||
Топикстартер спрашивал нормально ли будет сделать так:
В этом коде действия, подставляемые компилятором после начала процедуры но до первой строки пользовательского кода (и после последней строки но до возврата из процедуры) выполняются вне критической секции пользователя. Значит нужно включить использование критической секции менеджера памяти с помощью IsMultiThread
задай вопрос конкретнее |
| Автор: Felan 13.9.2008, 15:17 | ||||||||
Ну и я о том же
Полностью согласен.
Не понял, как звучит обратное утверждение? Мне кажется, что мы об одном и том же... Я лично не сталкивался с флагом IsMultiThread, только читал про него. Многопоточные приложения писал и пишу, но пользую TThread, поэтому не думаю об этом флаге. На вопрос топикастера ты ответил:
Я утверждаю, что установки этого флага не достаточно. Т.к. этот флаг будет отвечать за выделение памяти под данные из разных потоков, но не за доступ к ним. Доступ к ним надо синхронизировать отдельно. А в случае топикастера вообще все параллельно. У него данные только в стеке, так что для каждого потока свои будут |