Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> потоки + глобальные функции 
:(
    Опции темы
vitaly1979
Дата 28.2.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как происходят одновременные вызовы какой-либо глобальной для модуля функции из потоков?
Например нужно переопределить функции сокетов:
Код

int send_(....)
{
      ....
      FDSET...; 
      send(....);
      select(...);
      .... 
}
int recv_(....)
{
      ....
      FDSET...; 
      recv(....);
      select(...);
      ....
}
void Thread()
{
      ....
      send_(...);
      recv_(...);
      ....
}


Проблем никаких не будет?

Это сообщение отредактировал(а) vitaly1979 - 28.2.2006, 13:35
PM MAIL   Вверх
Romikgy
Дата 28.2.2006, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Синхронизация нужна, если обращение к ф-циям из нескольких потоков будет


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
vitaly1979
Дата 28.2.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Это точно?
А как же например несколько потоков вызывают одновременно функции АПИ из ДЛЛ?
PM MAIL   Вверх
Romikgy
Дата 28.2.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(vitaly1979 @ 28.2.2006, 12:49 Найти цитируемый пост)
А как же например несколько потоков вызывают одновременно функции АПИ из ДЛЛ?

где ты такое видел?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
vitaly1979
Дата 28.2.2006, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Romikgy, ну как же -)
все АПИ как известно в ДЛЛ, а код ДЛЛ в адресном пространстве всех ниших программ
допустим несколько потоков открывают одновременно разные файлы с помощью CreateFile
код функции CreateFile всего один и по одному адресу
получается что стек функции CreateFile создается для каждого потока отдельно?
и в моем случае будет также?

PM MAIL   Вверх
takedo
Дата 28.2.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 3



Я так думаю, что функция это кусок кода, по которому проходят потоки. Скорее всего каждый вызов функции ознаменован своими параметрами с которыми поток войдет в этот участок кода. Поэтому, ничего страшного в таких заходах нет. Вот другое дело, если ты в этих функциях оперируешь глобальными переменными, с которыми могут одновременно работать все твои потоки, тогда может наступить попа без синхронизации.
PS.:А вообще то у меня давненько назревает подобный вопросик, нет времени его сформулировать и задать.


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
maxim1000
Дата 28.2.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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


--------------------
qqq
PM WWW   Вверх
Romikgy
Дата 28.2.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



Цитата(vitaly1979 @ 28.2.2006, 13:34 Найти цитируемый пост)
получается что стек функции CreateFile создается для каждого потока отдельно?

длл для каждой проги копирует себя в адр. пр-ство программы, но это здесь не причем
Цитата(maxim1000 @ 28.2.2006, 13:43 Найти цитируемый пост)
читают какую-нибудь информацию

при записи .... может быть
Цитата(takedo @ 28.2.2006, 13:43 Найти цитируемый пост)
попа

smile


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
maxim1000
Дата 28.2.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(vitaly1979 @ 28.2.2006, 13:34 Найти цитируемый пост)
получается что стек функции CreateFile создается для каждого потока отдельно?

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



--------------------
qqq
PM WWW   Вверх
threef
Дата 15.3.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



При вызове функции из потока она использует стек этого потока. Автоматические переменные создаются в стеке - это те, которые внутри функции не описаны как static.
Поэтому, если функция, вызываемая из главной функции потока не оперирует статическими или глобальными переменными, то она может выполняться "одновременно". Такие функции в древности называли повторно входимыми или реентерабельными.
Если функция использует глобальные/статические переменные, то она не является повторно входимой. Необходимо обеспечить явную передачу доступа к глобальной/статической переменной из каждой функции. Для этого используется синхронизация - критические секции, мьютексы, события, ждущие функции и т.п. Функция, работающая с переменной явно захватывает эту переменную, остальные должны подождать освобождения переменной.
Дополнительные "заморочки" возникают при использовании динамических переменных - от захвата кучи процесса до явного назначения потоку собственной кучи.
PM MAIL   Вверх
takedo
Дата 17.3.2006, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 3



threef,
Цитата

Дополнительные "заморочки" возникают при использовании динамических переменных
- можно поподробнее? Например если я делаю цикл в функции:
Код

int* i;
i = new int;
for(*i=0;*i<10001;*i++)
{
...
}
delete i;

где могут быть проблемы?
PS.: я не ёрничаю, просто очень хочется до конца понять где проблемы. smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
chipset
Дата 17.3.2006, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

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



Цитата(takedo @ 16.3.2006, 21:57 Найти цитируемый пост)
- можно поподробнее? Например если я делаю цикл в функции:

Код

int* i;
    
i = new int;
    
for(*i=0;*i<10001;*i++)
    
{
    
...
    
}
    
delete i;
...
*i = 0;
while(*i<1001)
{
}
//или вообще
return i;



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Adil'
Дата 21.3.2006, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(threef @ 15.3.2006, 17:08 Найти цитируемый пост)
Дополнительные "заморочки" возникают при использовании динамических переменных - от захвата кучи процесса до явного назначения потоку собственной кучи.
Эти дополнительные заморочки обычно свалены на голову менеджера памяти компилятора, и самому о них думать не надо.



--------------------
Удачи
PM MAIL WWW   Вверх
takedo
Дата 22.3.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 3



Adil' - даааа. хороший ответ! Но что-то можно понять сиё высказывание и так: "Хороший компилятор - нет проблем, а вот если вы программируете в Крекер С++ или Макдональдс C - то будут проблемы".
Понятно с автоматической памятью, со статической, а вот с динамической - ? пока все раво неа smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
threef
Дата 23.3.2006, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



takedo
Прошу прощения за долгое молчание

Заморочки в потоках при использовании кучи очень простые.
Код


typamoy *x;
...
for(;;)
{
   x= new typamoy(abrakadabra);
   ...
   delete x;
}


и этот цикл внутри функции потока. Чтобы не изгадить кучу(во каламбур!) нужно защититься
HeapLock / Unlock, но это еще не полное решение проблемы. В результате выполнения многих потоков куча может слегка дефрагментироваться, и, так как ею управляет вовсе не компилятор, то и тут нужно соломки подстелить - лучше выделить для разных потоков разные кучи. Отработал поток - удалить его( за ним ?) кучу. И основная куча не так решетится.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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