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

Вниз

Программирование многопоточности. Мои грабли.   Найти похожие ветки 

 
oxffff   (2004-11-29 16:48) [0]

Уважаемые знатоки тонкостей.

Совсем бесполезная программа

После запуска программы вываливается исключение нарушение доступа.

Ошибка происходит в модуле getmem.inc в функции InsertFree.

Хотя если обрамить занесение в список входом в критическую секцию, то все нормально прокатывает.
 
Лично у меня подозрения что какие то грабли с менеджером памяти.
Хотя я могу ошибаться.
Заранее благодарен.

Ответ прошу выслать мне Email: oxffff@uii.sever.ru

 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 threads:array of thandle;
 lists:array of TList;
 constructor Create(AOwner: TComponent);override;
 destructor destroy;override;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

function ThreadProc(p:pointer):DWORD;stdcall;
var a:integer;
begin
for a:=1 to 100000000 do TList(p).Add(form1);
end;

constructor TForm1.Create(AOwner: TComponent);
var tCount:integer;
   a:integer;
begin
inherited;
tCount:=28;
setlength(threads,tCount);
setlength(lists,tCount);
for a:=0 to tCount-1 do lists[a]:=TList.Create;
end;

destructor TForm1.destroy;
var a:integer;
begin
for a:=0 to length(threads)-1 do SuspendThread(threads[a]);
for a:=0 to length(lists)-1 do
  begin
  lists[a].free;
  end;
SetLength(threads,0);
SetLength(lists,0);
inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
var a:integer;
   tid:DWORD;
begin
for a:=0 to length(threads)-1 do threads[a]:=CreateThread(nil,0,@ThreadProc,lists[a],0,tid);
end;


 
raidan ©   (2004-11-29 16:52) [1]

>oxffff   (29.11.04 16:48)
Абалдеть ((с) Гальский)!
Совсем бесполезные программы никому не интересны.
Для начала почитай о семафорах и им подобных вещах (т.е. о том, как организуется доступ к ресурсам в параллельных потоках).


 
Digitman ©   (2004-11-29 16:55) [2]


> если обрамить


в ДАННОМ контексте - почему бы и не "обрамить"?
сомнения-то какие ?


 
Digitman ©   (2004-11-29 16:59) [3]


> oxfff


вот ты нахреначил length(threads) трэдов.
и каждый из них в какое-то время (неведомое заранее тебе !!!!) пытается выполнить обращение к списку p.

а ведь список p - НЕ-РАЗ-ДЕ-ЛЯ-Е-МЫЙ ресурс !
он ТРЕ-БУ-ЕТ синхронизации доступа к нему !


 
oxffff   (2004-11-29 17:00) [4]

Уважаемый raidan.
Если вы внимательно смотрели, то наверняка заметилы что каждый поток работает со своим Tlist, поэтому говорить о какой ли бо синхронизации здесь не уместно.
Каждый поток работает со своим Tlist.
А что насчет семафоров, мутексов, крит. секций, spinlocks(kernel mode) знания есть.
Так что извольте все посмотреть внимательно.


 
oxffff   (2004-11-29 17:03) [5]

Уважаемый digitman

Смотрите во первых если вы внимательно смотрели, то обращение к динамическому масиву происходят все из одного потока из главного.

Так что здесь нет нарушения доступа.
Еще раз говорю, что прога начинает работать, а потом вываливает exception


 
Суслик ©   (2004-11-29 17:05) [6]

грабли в манагере скорее всего и есть. Не случайно дельфи выставляет флажок IsMultiThread при создании дополнительного потока...


 
oxffff   (2004-11-29 17:07) [7]

Уважаемые digitman и raidan Подумайте.
Хотя бы просто запустите.
Посмотрите как работает потом уж советуйте.


 
oxffff   (2004-11-29 17:12) [8]

Огромное спасибо господин Суслик.
Я не знал про этот флаг.
Хорошо что есть люди которые реально знают и реально отвечают.
Еще раз спасибо.


 
raidan ©   (2004-11-29 17:20) [9]

Ты гляди-ка :)
Опустили :)


 
Суслик ©   (2004-11-29 17:21) [10]

забей, тут всегда так...


 
oxffff   (2004-11-29 17:32) [11]

Уважаемый Суслик.
Так или не так. Просто видно что вы разбираетесь.
Что грабли в том что надо было указать менеджеру памяти на то, что приложение многопотоковое (заставить его входить в критическую секцию при выделении памяти). Я об этом не знал. Я думал что менеджер памяти заботится об этом сам. Но понятно что по соображение быстродействия входить в критическую секцию в однопоточном приложении при выделении памяти весьма накладно. Поэтому ваш реальный указатель на возможность причины сработал сразу.
А если обидел Raidan, то сам он и виноват, Пусть думает для начала. Он думал что крут как Кнут, а нет.

Еще раз огромное спасибо за помощь добрый Суслик.


 
oxffff   (2004-11-29 17:35) [12]

Я имел ввиду что весьма накладно в плане быстродействия и отсутствия необходимости синхронизации при выделении памяти для
однопоточного приложения.
Суслик спасибо.


 
raidan ©   (2004-11-29 18:14) [13]

>oxffff   (29.11.04 17:32) [11]
Да все нормально :)
Это я сегодня очень злой, а сорвать зло больше негде :)


 
oxffff   (2004-11-29 19:19) [14]

:)


 
oxffff   (2004-11-29 19:26) [15]

:)



Страницы: 1 вся ветка

Текущий архив: 2004.12.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
6-1095392327
сигишник
2004-09-17 07:38
2004.12.12
CGI + IIS


14-1100753467
Megabyte-CeerCop
2004-11-18 07:51
2004.12.12
Зацените кто не видел. Написано на Delphi.


1-1101887144
Term
2004-12-01 10:45
2004.12.12
При пересылке данных через модем, файлы больше мегабайта пересыла


1-1101891672
Галинка
2004-12-01 12:01
2004.12.12
Как динамически создать рисунок на форме


6-1096729488
Луарвик
2004-10-02 19:04
2004.12.12
Правильный запрос (а не вопрос :))