![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
одновременное обращение к процедуре
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]Имхо, нет. В смысле, проблем нет.