![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| vitaly1979 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 26.2.2006 Репутация: нет Всего: 1 |
Как происходят одновременные вызовы какой-либо глобальной для модуля функции из потоков?
Например нужно переопределить функции сокетов:
Проблем никаких не будет? Это сообщение отредактировал(а) vitaly1979 - 28.2.2006, 13:35 |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 7 Всего: 146 |
Синхронизация нужна, если обращение к ф-циям из нескольких потоков будет
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| vitaly1979 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 26.2.2006 Репутация: нет Всего: 1 |
Это точно?
А как же например несколько потоков вызывают одновременно функции АПИ из ДЛЛ? |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 7 Всего: 146 |
где ты такое видел? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| vitaly1979 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 26.2.2006 Репутация: нет Всего: 1 |
Romikgy, ну как же -)
все АПИ как известно в ДЛЛ, а код ДЛЛ в адресном пространстве всех ниших программ допустим несколько потоков открывают одновременно разные файлы с помощью CreateFile код функции CreateFile всего один и по одному адресу получается что стек функции CreateFile создается для каждого потока отдельно? и в моем случае будет также? |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
Я так думаю, что функция это кусок кода, по которому проходят потоки. Скорее всего каждый вызов функции ознаменован своими параметрами с которыми поток войдет в этот участок кода. Поэтому, ничего страшного в таких заходах нет. Вот другое дело, если ты в этих функциях оперируешь глобальными переменными, с которыми могут одновременно работать все твои потоки, тогда может наступить попа без синхронизации.
PS.:А вообще то у меня давненько назревает подобный вопросик, нет времени его сформулировать и задать. -------------------- я не гольфист - я хоккеист |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
синхронизация нужно при доступе к данным (ну и к устройствам всяким)
само по себе исползование одной и той же функции из разных потоков синхронизации не требует даже если несколько потоков читают какую-нибудь информацию - тоже необязательно синхронизация начинает быть нужной, когда кто-то начинает что-то менять... -------------------- qqq |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 7 Всего: 146 |
длл для каждой проги копирует себя в адр. пр-ство программы, но это здесь не причем при записи .... может быть -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
стек для каждого потока создается в начале а вызываемые функции просто используют его так что на локальные переменные с точки синхронизации обращать много внимания не нужно - для каждого вызова функции - это новый набор другое дело static-переменные внутри функции - к ним нужно такое же внимание, как и к глобальным... -------------------- qqq |
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: нет Всего: 10 |
При вызове функции из потока она использует стек этого потока. Автоматические переменные создаются в стеке - это те, которые внутри функции не описаны как static.
Поэтому, если функция, вызываемая из главной функции потока не оперирует статическими или глобальными переменными, то она может выполняться "одновременно". Такие функции в древности называли повторно входимыми или реентерабельными. Если функция использует глобальные/статические переменные, то она не является повторно входимой. Необходимо обеспечить явную передачу доступа к глобальной/статической переменной из каждой функции. Для этого используется синхронизация - критические секции, мьютексы, события, ждущие функции и т.п. Функция, работающая с переменной явно захватывает эту переменную, остальные должны подождать освобождения переменной. Дополнительные "заморочки" возникают при использовании динамических переменных - от захвата кучи процесса до явного назначения потоку собственной кучи. |
|||
|
||||
| takedo |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
threef,
где могут быть проблемы? PS.: я не ёрничаю, просто очень хочется до конца понять где проблемы. -------------------- я не гольфист - я хоккеист |
||||
|
|||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 2 Всего: 165 |
--------------------
|
||||
|
|||||
| Adil' |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 311 Регистрация: 26.8.2004 Где: Питер Репутация: 2 Всего: 15 |
-------------------- Удачи |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
Adil' - даааа. хороший ответ! Но что-то можно понять сиё высказывание и так: "Хороший компилятор - нет проблем, а вот если вы программируете в Крекер С++ или Макдональдс C - то будут проблемы".
Понятно с автоматической памятью, со статической, а вот с динамической - ? пока все раво неа -------------------- я не гольфист - я хоккеист |
|||
|
||||
| threef |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: нет Всего: 10 |
takedo
Прошу прощения за долгое молчание Заморочки в потоках при использовании кучи очень простые.
и этот цикл внутри функции потока. Чтобы не изгадить кучу(во каламбур!) нужно защититься HeapLock / Unlock, но это еще не полное решение проблемы. В результате выполнения многих потоков куча может слегка дефрагментироваться, и, так как ею управляет вовсе не компилятор, то и тут нужно соломки подстелить - лучше выделить для разных потоков разные кучи. Отработал поток - удалить его( за ним ?) кучу. И основная куча не так решетится. |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |