Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Использование объектов одного класса в потоках


Автор: Karrde 27.9.2010, 21:26
Вот стало интересно. Если создавать множество потоков, и в каждом отдельно создавать по экземпляру класса(статических методов и переменных нет), то при работе потоков все равно будут конфликты? надо делать синхронизацию? ещё дело осложняется тем, что присутствует длл, к которой идет обращение из методов этого класса. Можно ли сделать полностью независимую друг от друга работу потоков?

Автор: Skynin 27.9.2010, 21:45
Синхронизировать нужно только обращение к одному на всех ресурсу.
В данном случае - место обращения к dll

Автор: mihryak 27.9.2010, 21:52
синхронизировать надо только общие для всех потоков ресурсы, т.е. если у тебя в каждом потоке по экземпляру класса, и один поток не обращается никак к другому за ним, то и синхронизация не нужна
про длл, не видя её кода, сказать ничего нельзя, если потоки обращаются к функции, у которой есть, к примеру, статический счётчик, то этот счётчик и будет тем самым общим ресурсом, доступ к которому необходимо синхронизировать
т.е., чтобы работа потоков не зависила друг от друга, нужно избавиться от общих ресурсов, а такие задачи встречаются совсем редко (только в тех случаях, наверное, когда достаточно запустить поток-задачу, и наплевать, каков будет её результат)

Добавлено через 1 минуту и 43 секунды
Цитата(Skynin @  27.9.2010,  22:45 Найти цитируемый пост)
В данном случае - место обращения к dll 

а почему так категорично?

(писал свой ответ, когда топик состоял из одного вопроса)

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

Автор: Karrde 27.9.2010, 22:18
Хммм. проблема в том, что длл-сторонняя, и заглянуть в код к ней нет никакой возможности

Цитата

нужно избавиться от общих ресурсов, а такие задачи встречаются совсем редко

Т.е. ты имеешь в виду, что код без статических счетчиков встречается редко?(( т.е. не прокатит?( Просто дело в том, что именно функции этой длл очень долго выполняются, а учитывая что надо будет одновременно обрабатывать по несколько клиентов(в клиент-серверном приложении), то последний клиент своей инфы при последовательном выполнении в одном потоке может и не дождаться. А так-шанс есть)) поэтому желательно параллельное выполнение функций этой длл независимо друг друга. Но похоже, там все таки есть какие то общие для всей длл-ки ресурсы(не факт, что статические, мот быть просто private структуры, вынесенные за пределы методов).
Есть ли шанс это как нить распараллелить?

Автор: mihryak 27.9.2010, 22:37
Цитата(Karrde @  27.9.2010,  23:18 Найти цитируемый пост)
ты имеешь в виду, что код без статических счетчиков встречается редко?

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

Цитата(Karrde @  27.9.2010,  23:18 Найти цитируемый пост)
Но похоже, там все таки есть какие то общие для всей длл-ки ресурсы

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


Автор: Karrde 27.9.2010, 22:46
Цитата

 имел в виду, что при работе с потоками обычно нужно дождаться их окончания и как-то обработать результат.

Логично)) ну тут уже кодом полностью управляю я, и с синхронизацией разберусь. делегаты тут, думаю, сработают неплохо. Главное, чтобы результаты длл-ка правильные выдавала)
Длл-ка написана на c++(native). В общем, похоже, хватит мне уже тут теоретизировать, надо попробовать и посмотреть, что и как будет выдавать. Спасибо за помощь))

Автор: userdab 27.9.2010, 23:49
http://social.msdn.microsoft.com/Forums/ru-RU/windowsru/thread/0ac28a8a-b3ff-44e4-a001-af7af24df96f#2796d0bb-5bdf-4831-b2bc-2d9fee5eb779

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)