![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 2 Всего: 19 |
Тема многопоточности достаточно не новая, но я на таком уровне многопоточности впервые и возникла трабла.
У меня в приложении есть класс, который выполняет обработку файла, все действия прописаны и задача их стоит только в правильном порядке выполнения, я в каждом потоке просто создаю свой экземпляр класса и потокам скармливаю разные файлы, и всё было неплохо, до того момента пока не стал тестировать на многих файлах сразу... Вылетают ошибки в местах где происходит обращение к ресурсам, которые есть вне потоков. У меня есть функция, которая считает идентификатор нового элемента добавляемого в БД, так вот она вынесена отдельно и существует как самостоятельная функция, когда один поток не получил результат от неё а второй уже начинает к ней обращаться вылетает ошибка, от компонента БД что дескать предыдущая операция не завершена... Т.е. на лицо проблема синхронизации... в целом я могу решить её установкой флага у класса монитора(класс который следит за потоками) что есть кто-то кто сохраняется и пока один сохраняет данные в БД, остальные будут его ждать... Но может можно по другому решить эту проблему? Мне просто кажется в таком случае может оказаться так что допустим при 10 потоках будут появляться потоки которые как бы зависли, а на самом деле они просто ожидают пока переменная примет значение разрешающая сохранится... -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." ![]() ![]() ![]() |
|||
|
||||
Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 192 Всего: 484 |
Если операция обращения к БД не критична, то можно её игнорировать, если она занята.
Но обычно это не так. Так что я бы порекомендовал завернуть функцию в критическую секцию и смириться с тем, что потокам придётся иногда простаивать. Либо создать по одному независимому коннекту к базе от каждого потока. |
|||
|
||||
DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 2 Всего: 19 |
Вот именно что не так...
К сожалению это не решит проблему, потому что вызываемая функция будет висеть вообще на отдельно конекте... ну такая уж функция и трогать я её не буду... Snowy, спасибо за оперативность, вы подтвердили мои худшие опасения, но заодно решается другая проблема... -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." ![]() ![]() ![]() |
|||
|
||||
DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 2 Всего: 19 |
Вот же ш ё-моё, а оказывается не всё...
Есть ещё один вопрос... Есть у меня библиотечка для разных функций... Какова будет реакция этих функций(которые в DLL), если я почти одновременно вызову одну и туже функцию в разных потоках? Судя по тому что я знаю, как раз таки DLL вроде бы параллельно... функции из DLL у меня в программе связаны статически. P.S. просто вылетел непонятный Exception, а рядом кроме вызова этой функции ничего особенного нет -------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." ![]() ![]() ![]() |
|||
|
||||
Чучмек |
|
|||
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 14 Всего: 41 |
Неважно где функция - в dll или в exe. Если в функции нет ничего, что требует синхронизации - то и проблем никаких не будет. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
DarkProg |
|
|||
![]() Законченный романтик ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1784 Регистрация: 11.3.2009 Где: Земля Репутация: 2 Всего: 19 |
Всё, теперь вроде всё понял.
-------------------- "И твоя голова всегда в ответе за то куда сядет твой зад..." "Я студент - скажите с какого я ВУЗа..." ![]() ![]() ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |