![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Unregistered |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 23.6.2004 Репутация: нет Всего: нет |
Помогите разобраться с критическими секциями.
Что если у меня несколько участков памяти (class TObject) и к каждой из них идет обращение как с главного потока, так и с дочернего (на обработку каждого Object'a свой дочерний поток)? Я попробовал для каждого такого участка создавать свою критическую секцию. Секции храню в массиве. Но массив-то тоже глобальная перменная, и к ней надо тоже доступ синхронизировать. В общем запутался я чего-то... То ли лыжи не едут, то ли... PS пишу в этот подфорум потому, что использую функции InitializeCritical..., EnterCritical..., Leave.... Это сообщение отредактировал(а) Unregistered - 6.9.2006, 10:59 |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Создаёшь объект (глобальный или где-то размещённый так, чтоб был всем доступен)
var block: TCriticalSection; block := TCriticalSection.Create;
Добавлено @ 11:01 Подробнее в справке по TCriticalSection Добавлено @ 11:02 Если интересует на уровне чистого апи - без обёрток, то найди в сети книжку Рихтера - там всё подробно расписано. Добавлено @ 11:03 И вот тут почитай: http://forum.vingrad.ru/index.php?showtopi...mp;#entry480380 |
|||
|
||||
| Unregistered |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 23.6.2004 Репутация: нет Всего: нет |
т.е обращение к самой критической секции синхронизировать не надо (ну вообще-то это было бы смешно, прям анекдот получился
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Одновременно в секцию может войти только один тред.
Пока он там - остальные ждут на входе. Как тока он вышел - входит следующий в очереди (если он есть конечно). То есть block.Acquire - сидим и ждём, если там кто-то есть. Продолжаем, если свободно. Естественно это расчитано на быстрые операции. Надолго секцию занимать не стоит... Добавлено @ 11:41
|
|||
|
||||
| Unregistered |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 25 Регистрация: 23.6.2004 Репутация: нет Всего: нет |
ого. в статье которую ты предложил написано, что указатель на критическую секцию можно хранить непосредственно в объекте, да еще и в метод блокировки сделать. а я тут...выеживаюсь... мне тогда массив не нужен, а вместе с ним и куча кода. я правильно понял?
|
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Можно хранить в объекте, можно использовать один глобальный. Не важно.
Главное, чтобы все треды принадлежали одному процессу. Критические секции работают в пределах процесса со всеми его тредами. Не подходит для межпроцессной синхронизации. Но это тебе и не нужно. Главное не забудь поместить работу при занятой секции в try..finally. В finally - отпускаё её. А то не дай бог, случится ошибка - секция останется занятой и всё повиснет нафиг. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Я бы все же пользовался TCriticalSection.Enter и TCriticalSection.Leave вместо Acquire и Release. Не для того они предназначены.
-------------------- |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Они идентичны.
По крайней мере так говорит справка дельфи. В той же стправке пример юзанья выглядит так:
|
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 13 Всего: 146 |
Добавлено @ 14:04 from SyncObjs.pas -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Romikgy, так это так и было задумано для тех кто привык уже к определенным названиям, чтоб не переучиватся. Вот за это я люблю Borland - все таки заботятся они о программистах
Это сообщение отредактировал(а) alexeis1 - 6.9.2006, 14:10 -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Snowy |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Romikgy, это же написано и в справке.
|
||||
|
|||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Обратите внимание, что Acquire и Release виртуальные и предназначены для перекрытия. В отличие от Enter и Leave.
-------------------- |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
И что это меняет?
|
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
То, что эти методы постоянны. В отличие от Acquire и Release. Если так хочется, то пусть это будет делом вкуса и стиля каждого. -------------------- |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Гм. Ну к примеру метод Free тоже постоянный. И он вызывает виртуальный Destroy...
Здесь же ещё проще. Тут даже дополнительных действий нету. Тупо вызов. Не пойму, к чему это... ИМХО Enter и Leave число для совместимости или удобства введены. Физической нагрузки тут никакой не наблюдаю. |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |