Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.087 c
2-1275776869
akosh12345
2010-06-06 02:27
2010.08.27
Динамическая память


15-1266442205
Юрий
2010-02-18 00:30
2010.08.27
С днем рождения ! 18 февраля 2010 четверг


2-1269262492
Guz
2010-03-22 15:54
2010.08.27
Delphi 7, реестр.


15-1262712162
Anatoly Podgoretsky
2010-01-05 20:22
2010.08.27
Режим бога в Вигдоус 7


15-1270633433
И. Павел
2010-04-07 13:43
2010.08.27
Порекомендуйте компонент для шифрования





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский