Главная страница
    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.111 c
15-1264414882
12
2010-01-25 13:21
2010.08.27
Использование процессом памяти > 2 ГБ


2-1274384328
pro_xaoc
2010-05-20 23:38
2010.08.27
Ошибка с процедурой


15-1271172177
bss
2010-04-13 19:22
2010.08.27
Объясните, пожалуйста, насчет синтаксиса XSD


2-1274355596
Jacksotnik
2010-05-20 15:39
2010.08.27
Помогите составить SQL запрос


6-1222066908
Michael
2008-09-22 11:01
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский