Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

одновременное обращение к процедуре


tippa ©   (2010-03-15 14:40:00) 

Подскажите пожалуйта, могут ли 2 потока одновременно вызвать одну глобальную процедуру. Не будет ли проблем?


Юрий Зотов   (2010-03-15 16:52:00) [1]

> tippa   (15.03.10 16:28) [10]

>В чем фишка?

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


Anatoly Podgoretsky   (2010-03-15 16:46:00) [2]

> И. Павел  (15.03.2010 16:31:11)  [11]

Иначе бы и рекурсия не работала бы.


И. Павел   (2010-03-15 16:32:00) [3]

саои -> свои


И. Павел   (2010-03-15 16:31:00) [4]

Процедура, если она не inline, как будет одна, так и останется. А локальные переменные на каждый вызов - саои. Рекурсия ведь как-то выполняется.


tippa   (2010-03-15 16:28:00) [5]

Поясните как так получается? Вот запускаю программу, потом запускаются 2 потока, первый первым доходит до процедуры и когда i=100 второй поток только подошел к процедуре. Получается второй будет ждать пока первый не выйдет из процедуры. Или программа при компиляции сама создаст по отдельной процедуре для каждого потока? В чем фишка?


DVM   (2010-03-15 16:27:00) [6]


> tuppa   (15.03.10 15:47) [5]
> А как поток в неё зайдет, если в ней в это время другой
> поток?

Что значит зайдет? Процедура - это скорее инструкция что и как делать процессору, и ничто не мешает эту инструкцию читать сразу 2 и более потокам. Но вот если в инструкции сказано "пойди и измени глобальную переменную A", а потом сказано "пойди и узнай значение глобальной переменной А", то может случиться так, что два потока, совершенно не подозревая друг о друге будут пытаться менять и читать значение одной и той же переменной, что может привести к ошибкам.


И. Павел   (2010-03-15 16:15:00) [7]

Не волнуйтесь, не перемешаются :).


tippa   (2010-03-15 16:07:00) [8]

>А как поток в неё зайдет, если в ней в это время другой поток?
Да, кстати?

переменная "i" не будет "перемешиваться" если так?

procedure myproc;
var i:integer;
begin
for i:=0 to 1000 do...
end;

procedure mythread1.execute;
begin
 myproc;
end;

procedure mythread2.execute;
begin
 myproc;
end;


или писать процедуру для каждого потока:

procedure mythread1.execute;
    procedure myproc;
    var i:integer;
    begin
    for i:=0 to 1000 do...
    end;
begin
 myproc;
end;

procedure mythread2.execute;
    procedure myproc;
    var i:integer;
    begin
    for i:=0 to 1000 do...
    end;
begin
 myproc;
end;


oldman   (2010-03-15 15:53:00) [9]


> tuppa   (15.03.10 15:47) [5]
> А как поток в неё зайдет, если в ней в это время другой
> поток?


Кто куда зайдет?


tuppa   (2010-03-15 15:47:00) [10]

А как поток в неё зайдет, если в ней в это время другой поток?


DVM   (2010-03-15 14:47:00) [11]


> tippa

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


oldman   (2010-03-15 14:46:00) [12]

Хотя...
А что делает та процедура?


Вариант   (2010-03-15 14:46:00) [13]

Могут. Проблем не будет, если процедура не пользуется разделяемыми ресурсами или переменными, или пользуется ими правильно.


oldman   (2010-03-15 14:44:00) [14]

Имхо, нет. В смысле, проблем нет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо