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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки и синхронизация вызовов функций из dll, Правильно ли я делаю!? 
:(
    Опции темы
Loony
Дата 25.5.2008, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый вечер, Уважаемые! Скажу сразу, с Delphi не очень дружу, могу сморозить чушь! smile Тема заезженная, но поиском по форуму я вразумительного ответа не получил! Возникла такая задача: есть длл, в ней зашиты функции для получения определенных данных из сети. К длл необходимо обращаться из множества потоков, т.е. необходимо чтобы в один момент времени функцию вызывал только один поток, кроме того, нужно обновлять данные на форме в зависимости от значения, полученного из функции в длл. Сначала сделал просто через Synchronize, ну не знал я, что метод служит только для взаимодействия с основным потоком! smile Узнал, когда получил две одинаковые порции данных. Следующая мысль - это реализовать все при помощи "Critical Section", но дело в том, что в известной на этом сайте статье про многопоточность говорится, что вообще не рекомендуется надолго блокировать потоки, а у меня така ситуация возможна, т.к. длл может обратиться к сетевому ресурсу, который не ответит мгновенно!

Вопросы:
1. Правльным ли будет использовать в моем случае критические секции?
2. Если нет, то что надо использовать!?
3. Чем грозит длительная блокировка потока и грозит ли чем-то вообще?
4. Возможно при использовании Delphi с потоками есть еще какие-то ньюансы?

P.S. Delphi 7, если это важно!
PM MAIL   Вверх
Alexeis
Дата 25.5.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Loony @  25.5.2008,  20:19 Найти цитируемый пост)
3. Чем грозит длительная блокировка потока и грозит ли чем-то вообще?

  Ни чем не грозит кроме ожидания. Блокировать доступ нужно ко всем функциям или только к той конкретной, которая используется в текущий момент? Если только текущую, то можно сделать несколько критических секций для каждой функции.


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

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

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


Новичок



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

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



То есть, на первый вопрос ответ - да!? smile Вообще надо так: сначала вызывается функция  для генерации уникальных данных, потом функция, которая должна эти данные передать и вернуть результат! Блокировать значит нужно обе, т.е. входим в критическую секцию, выполняем подряд две функции, получаем результат. Для отдельных функций делать критическуие секции думаю не стоит, не знаю даже, смысла не вижу. Может еще будут  советы по реализации!?
PM MAIL   Вверх
Alexeis
Дата 26.5.2008, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Loony @  25.5.2008,  21:48 Найти цитируемый пост)
ля отдельных функций делать критические секции думаю не стоит, не знаю даже, смысла не вижу. Может еще будут  советы по реализации!? 

  Я имел ввиду разместить критическую секцию внутри функции. Представь, что функцию вызываешь из разных модулей, тогда критическую секцию прийдеться объявлять в одном из общих модулей, да и забыть вставить ее можно случайно, а если критическую секцию вставить в функцию, то во первых понадобиться всего одна критическая секция во вторых, когда второй поток попытается вызвать функцию, то он зайдет и автоматом заблокируется. 
  Есть еще вариант сделать мьютекс с таймаутом. Т.е. второй поток зайдет в функцию подождет 100мс, увидит что ждать нужно долго и выйдет досрочно с специальным кодом ошибки, после чего сможет делать что-то другое и повторить попытку через некоторое время.


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

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

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


Новичок



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

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



Alexeis, если имеется ввиду внутри функции длл, то сделать этого не получится, исходников длл нет.
PM MAIL   Вверх
Felan
Дата 26.5.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Неважно. Можно сделать модуль-обертку, где будут просто вызываться нужные функции из длл + синхронизация.
От себя добавлю, что синхронизировать нужно только доступ к данным, причем, когда существует доступ на изменения.
Синхронизировать доступ на чтение к данным которые не изменяются не имеет смысла.
Синхронизировать функции генерации чего-либо, если при генерации не используются глобальные данных, которые существуют И изменяются между вызовами таких функций, тоже синхронизировать смысла нет.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Rennigth
Дата 26.5.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Felan @  26.5.2008,  14:20 Найти цитируемый пост)
Синхронизировать доступ на чтение к данным которые не изменяются не имеет смысла.

эт ты зря...


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


Амеба
Group Icon


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

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



Цитата(Rennigth @  26.5.2008,  14:07 Найти цитируемый пост)
эт ты зря... 

  Это еще почему? По моему синхронизация не нужна даже при условии что открывается только доступ для чтения. Важно чтобы не было даже косвенного влияния того что читается на то что пишется. Гарантия неизменности это дополнительное необязательное условие.
  Представим себе ситуацию. На сервер непрерывно поступают данные о прогнозе погоды по разным регионам. Существует много служб, которые достают эти данные и публикуют у себя. Ситуация что в прогноз на хабаровск будет текущий, а на Москву будет за прошлый час устраивает всех. Тем не менее, общий прогноз находиться на стадии записи, тогда как доступ к отдельным записям доступен всегда. 
  Если есть гарантия неизменности то вообще идеально... 


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

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

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


Новичок



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

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



Felan, обертки уже сделал! smile Всем спасибо!
PM MAIL   Вверх
Rennigth
Дата 26.5.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Alexeis, а что получится если два потока будут одновременно читать из одного места?
* ушел читать rtfm... но мне всегда казалось что... 


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


Амеба
Group Icon


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

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



Цитата(Rennigth @  26.5.2008,  15:58 Найти цитируемый пост)
Alexeis, а что получится если два потока будут одновременно читать из одного места?

  Такое происходит и постоянно. Например флаги мьютекса или семафора. К ним же происходит обращение из нескольких потоков, тот же счетчик семафора. Физически память не позволит одновременно обратиться даже при двух процах, потому это в любом случае будет последовательно.


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

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

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


Опытный
**


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

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



Цитата(Rennigth @  26.5.2008,  18:58 Найти цитируемый пост)
Alexeis, а что получится если два потока будут одновременно читать из одного места?
* ушел читать rtfm... но мне всегда казалось что...  

Ниче не будет. Оба прочитают и все. Если используются примитивные типы, то скорее всего ничего не будет даже если третий будет одновременно писать, а вот если классы, стринги, записи и т.п., то может получится так, что один поток начал писать, а второй начал читать, первый притормозил, а второй прочитал мусор...

Цитата(Alexeis @  26.5.2008,  19:15 Найти цитируемый пост)
  Такое происходит и постоянно. Например флаги мьютекса или семафора. К ним же происходит обращение из нескольких потоков, тот же счетчик семафора. Физически память не позволит одновременно обратиться даже при двух процах, потому это в любом случае будет последовательно. 

Ты не путай, это специальные объекты, доступ к которым контролирует система. А к память как раз даже очень позволяет обращаться одновременно из разных потоков. Для этого и существует синхронизация.


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 27.5.2008, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Felan @  27.5.2008,  06:29 Найти цитируемый пост)
Ты не путай, это специальные объекты, доступ к которым контролирует система. А к память как раз даже очень позволяет обращаться одновременно из разных потоков. Для этого и существует синхронизация. 

  И чем же системам ограничивает? Там просто атомарные типы отвечают за состояние, потому если один записал true, то другой не сможет прочитать что-то на середине записи состояния true. 

Цитата(Felan @  27.5.2008,  06:29 Найти цитируемый пост)
а вот если классы, стринги, записи и т.п., то может получится так, что один поток начал писать, а второй начал читать, первый притормозил, а второй прочитал мусор...

  Ну тут все зависит организации самого доступа и что считать противоречивым состоянием. Это определяется в каждом конкретном случае отдельно. Излишняя синхронизация тоже вредна, более того она может приводить самоблокировке системы там где можно было без этого обойтись.


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

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

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


Опытный
**


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

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



Цитата(Alexeis @  27.5.2008,  09:59 Найти цитируемый пост)
  И чем же системам ограничивает? Там просто атомарные типы отвечают за состояние, потому если один записал true, то другой не сможет прочитать что-то на середине записи состояния true. 

Внутренними правилами ограничивает. Не путай системные спец. объекты и доступ к памяти.

Цитата(Alexeis @  27.5.2008,  09:59 Найти цитируемый пост)
  Ну тут все зависит организации самого доступа и что считать противоречивым состоянием. Это определяется в каждом конкретном случае отдельно. Излишняя синхронизация тоже вредна, более того она может приводить самоблокировке системы там где можно было без этого обойтись. 

Тут все зависит от везения. Т.к. resume останавливает поток в произвольном месте между процессорными инструкциями, и если запись данных занимает болше одной инструкции, то вероятна ситуация, когда записано только половина данных. И вероятность пропорциональна количеству потоков и частоте обращений.
Поэтому и рекомендуется явно выделять точки ожидания для потока.

Что такое самоблокировка? Если криво сделана синхронизация, так, что она приводит к дедлоку, то это именно криво сделанная синхронизация. Само обычно ничего не бывает smile


--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Alexeis
Дата 27.5.2008, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(Felan @  27.5.2008,  07:50 Найти цитируемый пост)
Что такое самоблокировка? Если криво сделана синхронизация, так, что она приводит к дедлоку, то это именно криво сделанная синхронизация. Само обычно ничего не бывает

  Например потоки работают с 2мя записями. Для этого она захватывает одну и ждет вторую, в это время второй поток захватил вторую и ждет первую, которую занял первый. Таким образом 2 потока ждут друг друга. Возможны и другие более сложные ситуации с косвенной связью, потому избыточная синхронизация также вредна как и недостаточная. 


--------------------
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.1001 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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