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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема разделения ресурсов в потоках 
V
    Опции темы
DarkProg
Дата 28.6.2012, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Тема многопоточности достаточно не новая, но я на таком уровне многопоточности впервые и возникла трабла.

У меня в приложении есть класс, который выполняет обработку файла, все действия прописаны и задача их стоит только в правильном порядке выполнения, я в каждом потоке просто создаю свой экземпляр класса и потокам скармливаю разные файлы, и всё было неплохо, до того момента пока не стал тестировать на многих файлах сразу...

Вылетают ошибки в местах где происходит обращение к ресурсам, которые есть вне потоков.
У меня есть функция, которая считает идентификатор нового элемента добавляемого в БД, так вот она вынесена отдельно и существует как самостоятельная функция, когда один поток не получил результат от неё а второй уже начинает к ней обращаться вылетает ошибка, от компонента БД что дескать предыдущая операция не завершена...

Т.е. на лицо проблема синхронизации... в целом я могу решить её установкой флага у класса монитора(класс который следит за потоками) что есть кто-то кто сохраняется и пока один сохраняет данные в БД, остальные будут его ждать...

Но может можно по другому решить эту проблему?
Мне просто кажется в таком случае может оказаться так что допустим при 10 потоках будут появляться потоки которые как бы зависли, а на самом деле они просто ожидают пока переменная примет значение разрешающая сохранится...


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Snowy
Дата 28.6.2012, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Если операция обращения к БД не критична, то можно её игнорировать, если она занята.
Но обычно это не так.
Так что я бы порекомендовал завернуть функцию в критическую секцию и смириться с тем, что потокам придётся иногда простаивать.
Либо создать по одному независимому коннекту к базе от каждого потока.
PM MAIL   Вверх
DarkProg
Дата 28.6.2012, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Цитата(Snowy @  28.6.2012,  16:35 Найти цитируемый пост)
Но обычно это не так.

Вот именно что не так...

Цитата(Snowy @  28.6.2012,  16:35 Найти цитируемый пост)
Либо создать по одному независимому коннекту к базе от каждого потока. 

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

Snowy, спасибо за оперативность, вы подтвердили мои худшие опасения, но заодно решается другая проблема...


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
DarkProg
Дата 28.6.2012, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Вот же ш ё-моё, а оказывается не всё...

Есть ещё один вопрос...
Есть у меня библиотечка для разных функций...
Какова будет реакция этих функций(которые в DLL), если я почти одновременно вызову одну и туже функцию в разных потоках?
Судя по тому что я знаю, как раз таки DLL вроде бы параллельно... функции из DLL у меня в программе связаны статически.

P.S. просто вылетел непонятный Exception, а рядом кроме вызова этой функции ничего особенного нет


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
Чучмек
Дата 28.6.2012, 21:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



Цитата(DarkProg @  28.6.2012,  21:18 Найти цитируемый пост)
Какова будет реакция этих функций(которые в DLL), если я почти одновременно вызову одну и туже функцию в разных потоках?


Неважно где функция - в dll или в exe.

Если в функции нет ничего, что требует синхронизации - то и проблем никаких не будет.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
DarkProg
Дата 29.6.2012, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


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

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



Всё, теперь вроде всё понял.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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