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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Критические секции, научите с ними обращаться 
V
    Опции темы
Unregistered
Дата 6.9.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите разобраться с критическими секциями.
Что если у меня несколько участков памяти (class TObject) и к каждой из них идет обращение как с главного потока, так и с дочернего (на обработку каждого Object'a свой дочерний поток)? Я попробовал для каждого такого участка создавать свою критическую секцию. Секции храню в массиве. Но массив-то тоже глобальная перменная, и к ней надо тоже доступ синхронизировать. В общем запутался я чего-то... То ли лыжи не едут, то ли...

PS пишу в этот подфорум потому, что использую функции InitializeCritical..., EnterCritical..., Leave....

Это сообщение отредактировал(а) Unregistered - 6.9.2006, 10:59
PM MAIL   Вверх
Snowy
Дата 6.9.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Создаёшь объект (глобальный или где-то размещённый так, чтоб был всем доступен)
var block: TCriticalSection;

block := TCriticalSection.Create;

Код

  block.Acquire; // войти 
  try
    .... // что-то делаем
  finally
    block.Release; // освобождаем
  end;


Добавлено @ 11:01 
Подробнее в справке по TCriticalSection

Добавлено @ 11:02 
Если интересует на уровне чистого апи - без обёрток, то найди в сети книжку Рихтера - там всё подробно расписано.

Добавлено @ 11:03 
И вот тут почитай: http://forum.vingrad.ru/index.php?showtopi...mp;#entry480380
PM MAIL   Вверх
Unregistered
Дата 6.9.2006, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



т.е обращение к самой критической секции синхронизировать не надо (ну вообще-то это было бы смешно, прям анекдот получился  smile ) а к массиву? я ведь вхожу в критическую секцию посредством элемента массива.
PM MAIL   Вверх
Snowy
Дата 6.9.2006, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Одновременно в секцию может войти только один тред.
Пока он там - остальные ждут на входе.
Как тока он вышел - входит следующий в очереди (если он есть конечно).
То есть block.Acquire - сидим и ждём, если там кто-то есть. Продолжаем, если свободно.
Естественно это расчитано на быстрые операции. Надолго секцию занимать не стоит...

Добавлено @ 11:41 
Цитата(Unregistered @  6.9.2006,  11:18 Найти цитируемый пост)
а к массиву? я ведь вхожу в критическую секцию посредством элемента массива.
Не понял... При чём тут массив. Это как туалет - зашёл - занято - вышел - свободно. Пока предыдущий не выйдет, следующий не зайдёт.
PM MAIL   Вверх
Unregistered
Дата 6.9.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ого. в статье которую ты предложил написано, что указатель на критическую секцию можно хранить непосредственно в объекте, да еще и в метод блокировки сделать.  а я тут...выеживаюсь... мне тогда массив не нужен, а вместе с ним и куча кода. я правильно понял?
PM MAIL   Вверх
Snowy
Дата 6.9.2006, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Можно хранить в объекте, можно использовать один глобальный. Не важно.
Главное, чтобы все треды принадлежали одному процессу. Критические секции работают в пределах процесса со всеми его тредами. Не подходит для межпроцессной синхронизации.
Но это тебе и не нужно.
Главное не забудь поместить работу при занятой секции в try..finally. В finally - отпускаё её.
А то не дай бог, случится ошибка - секция останется занятой и всё повиснет нафиг.
PM MAIL   Вверх
Демо
Дата 6.9.2006, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



Я бы все же пользовался TCriticalSection.Enter и TCriticalSection.Leave вместо Acquire и Release. Не для того они предназначены.


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 6.9.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Они идентичны.
По крайней мере так говорит справка дельфи.
В той же стправке пример юзанья выглядит так:
Код

LockXY.Acquire; { lock out other threads }
try
  Y := sin(X);
finally
  LockXY.Release;
end;

PM MAIL   Вверх
Romikgy
Дата 6.9.2006, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



smile 
Код

procedure TCriticalSection.Acquire;
begin
  EnterCriticalSection(FSection);
end;

procedure TCriticalSection.Release;
begin
  LeaveCriticalSection(FSection);
end;

procedure TCriticalSection.Enter;
begin
  Acquire;
end;

procedure TCriticalSection.Leave;
begin
  Release;
end;


Добавлено @ 14:04 
from SyncObjs.pas


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

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


Амеба
Group Icon


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

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



Romikgy, так это так и было задумано для тех кто привык уже к определенным названиям, чтоб не переучиватся. Вот за это я люблю Borland - все таки заботятся они о программистах smile 

Это сообщение отредактировал(а) alexeis1 - 6.9.2006, 14:10


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

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

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


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Romikgy, это же написано и в справке.
Цитата
Enter
Call Enter to block all other threads from entering code protected by this critical section until the Leave or Release method is called. Enter calls the Acquire method to bind the critical section to the calling thread.

Цитата
Leave
Call Leave at the end of a thread-sensitive section of code. Each call to Leave should be balanced by a call to Enter or Acquire at the beginning of the thread-sensitive section. Leave calls Release to allow other threads to acquire the critical section.

PM MAIL   Вверх
Демо
Дата 6.9.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



Обратите внимание, что Acquire и Release виртуальные и предназначены для перекрытия. В отличие от Enter и Leave.


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 6.9.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



И что это меняет?
PM MAIL   Вверх
Демо
Дата 6.9.2006, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



Цитата(Snowy @  6.9.2006,  20:18 Найти цитируемый пост)
И что это меняет?


То, что эти методы постоянны. В отличие от Acquire и Release.

Если так хочется, то пусть это будет делом вкуса и стиля каждого.


--------------------
    
PM MAIL ICQ Skype   Вверх
Snowy
Дата 6.9.2006, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Гм. Ну к примеру метод Free тоже постоянный. И он вызывает виртуальный Destroy...
Здесь же ещё проще. Тут даже дополнительных действий нету. Тупо вызов.
Не пойму, к чему это...
ИМХО Enter и Leave число для совместимости или удобства введены.
Физической нагрузки тут никакой не наблюдаю.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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