Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

одновременное обращение к процедуре   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.069 c
15-1265681360
brother
2010-02-09 05:09
2010.08.27
Береги клиента, бабло приносящего


2-1273577748
Shyrick
2010-05-11 15:35
2010.08.27
MainMenu & WinAPI


15-1266013815
Юрий
2010-02-13 01:30
2010.08.27
С днем рождения ! 13 февраля 2010 суббота


2-1271533393
Kukulkan
2010-04-17 23:43
2010.08.27
ADOQuery + SQL-выборка по дате!!!


2-1272341393
Игорь
2010-04-27 08:09
2010.08.27
GetProcessAffinityMask