Главная страница
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.146 c
6-1224228159
Forbi
2008-10-17 11:22
2010.08.27
Indy10 TCPServer и закрытие сессий


2-1265976020
00110011
2010-02-12 15:00
2010.08.27
Дубликаты в списке


2-1272016997
SSD
2010-04-23 14:03
2010.08.27
Как зделать чтобы при входе в программу запршивал логин и пароль


3-1243590436
gog
2009-05-29 13:47
2010.08.27
Прочитать unicode данные из Oracle


15-1265917923
AlexDan
2010-02-11 22:52
2010.08.27
по php..