C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: static  (Прочитано 1509 раз)
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


static
« : 17 Март 2015, 09:18:47 »

При соединении клиента компонент IdTCPServer создает отдельный поток и обрабатывает данные в событии IdTCPServer1Execute.
Допустим есть такой код:
Код
void function (String pos)
{
static A = ...
//****
}
 
//для каждого соединения отдельный поток:
void __fastcall TForm1Main::IdTCPServer1Execute(TIdContext *AContext)
{
 static B = ...
 
 function ("строка");
//****
}
 
 
Вопросы:
1. Будет ли переменная static B уникальная для каждого отдельного потока?
2. Будет ли при вызове функции  function из потока IdTCPServer1Execute, переменная static A уникальной для каждого потока?
На второй вопрос ответ вроде как НЕТ?
Записан
OVE
Участник


Сказали спасибо: +67/-0
Offline

Сообщений: 72


Re: static
« Ответ #1 : 17 Март 2015, 12:13:44 »

Что в первом, что во втором случае переменные уникальны для программы. Их можно рассматривать как обычные глобальные переменные с ограниченной областью видимости.
« Последнее редактирование: 17 Март 2015, 16:08:06 от S0mbre » Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: static
« Ответ #2 : 17 Март 2015, 17:10:29 »

Спасибо. Еще вопрос:
Есть функция
void ParseJsonArraySens(String my)

Теперь вызываем эту функцию из потока:
Код:
void __fastcall TForm1Main::IdTCPServer1Execute(TIdContext *AContext)
{
String elem;
//***
ParseJsonArraySens(elem)



В это время из другого потока IdTCPServer1Execute опять же вызывается void ParseJsonArraySens(String my)

Будет ли происходит работа функции void ParseJsonArraySens(String my) в каждом потоке отдельно?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: static
« Ответ #3 : 17 Март 2015, 19:23:58 »

Цитата: SilverFish от 17 Март 2015, 17:10:29
Спасибо. Еще вопрос:
Есть функция
void ParseJsonArraySens(String my)

Теперь вызываем эту функцию из потока:
Код:
void __fastcall TForm1Main::IdTCPServer1Execute(TIdContext *AContext)
{
String elem;
//***
ParseJsonArraySens(elem)



В это время из другого потока IdTCPServer1Execute опять же вызывается void ParseJsonArraySens(String my)

Будет ли происходит работа функции void ParseJsonArraySens(String my) в каждом потоке отдельно?

Да, конечно. Вообще, лучше почитай про потоки, чтобы лучше знать, как они работают, как используют память. В двух словах, потоки могут вызывать любые функции и методы и использовать любые объекты при условии, что они не затрагивают общие ресурсы, т.е. нет ситуаций, когда одновременно используются разными потоками одни и те же переменные. Такие ситуации называют data racing, bottlenecking и другими такими плохими словами 
Для этих случаев (и только для них!) существует множество способов заставить потоки работать правильно и ничего не напутать в памяти. Например, мьютексы, семафоры, критические секции, волатильные и атомарные переменные, использование потоковых пулов, очередь сообщений и т.д. и т.п...
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


« Ответ #4 : 17 Март 2015, 22:06:26 »

Большое спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.067 секунд. Запросов: 19.