Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Внизодновременное обращение к процедуре Найти похожие ветки
← →
tippa (2010-03-15 14:40) [0]Подскажите пожалуйта, могут ли 2 потока одновременно вызвать одну глобальную процедуру. Не будет ли проблем?
← →
oldman © (2010-03-15 14:44) [1]Имхо, нет. В смысле, проблем нет.
← →
oldman © (2010-03-15 14:46) [2]Хотя...
А что делает та процедура?
← →
Вариант (2010-03-15 14:46) [3]Могут. Проблем не будет, если процедура не пользуется разделяемыми ресурсами или переменными, или пользуется ими правильно.
← →
DVM © (2010-03-15 14:47) [4]
> tippa
Если в процедуре не используется обращение и изменение каких то общих разделяемых данных то проблем не будет. Иначе - возможны.
← →
tuppa (2010-03-15 15:47) [5]А как поток в неё зайдет, если в ней в это время другой поток?
← →
oldman © (2010-03-15 15:53) [6]
> tuppa (15.03.10 15:47) [5]
> А как поток в неё зайдет, если в ней в это время другой
> поток?
Кто куда зайдет?
← →
tippa (2010-03-15 16:07) [7]>А как поток в неё зайдет, если в ней в это время другой поток?
Да, кстати?
переменная "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;
← →
И. Павел © (2010-03-15 16:15) [8]Не волнуйтесь, не перемешаются :).
← →
DVM © (2010-03-15 16:27) [9]
> tuppa (15.03.10 15:47) [5]
> А как поток в неё зайдет, если в ней в это время другой
> поток?
Что значит зайдет? Процедура - это скорее инструкция что и как делать процессору, и ничто не мешает эту инструкцию читать сразу 2 и более потокам. Но вот если в инструкции сказано "пойди и измени глобальную переменную A", а потом сказано "пойди и узнай значение глобальной переменной А", то может случиться так, что два потока, совершенно не подозревая друг о друге будут пытаться менять и читать значение одной и той же переменной, что может привести к ошибкам.
← →
tippa (2010-03-15 16:28) [10]Поясните как так получается? Вот запускаю программу, потом запускаются 2 потока, первый первым доходит до процедуры и когда i=100 второй поток только подошел к процедуре. Получается второй будет ждать пока первый не выйдет из процедуры. Или программа при компиляции сама создаст по отдельной процедуре для каждого потока? В чем фишка?
← →
И. Павел © (2010-03-15 16:31) [11]Процедура, если она не inline, как будет одна, так и останется. А локальные переменные на каждый вызов - саои. Рекурсия ведь как-то выполняется.
← →
И. Павел © (2010-03-15 16:32) [12]саои -> свои
← →
Anatoly Podgoretsky © (2010-03-15 16:46) [13]> И. Павел (15.03.2010 16:31:11) [11]
Иначе бы и рекурсия не работала бы.
← →
Юрий Зотов © (2010-03-15 16:52) [14]> tippa (15.03.10 16:28) [10]
>В чем фишка?
В том, что исполняемый код процедуры один для всех потоков, а локальные переменные процедуры - свои собственные у каждого потока.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.057 c