Форум: "Основная";
Текущий архив: 2004.12.12;
Скачать: [xml.tar.bz2];
ВнизПрограммирование многопоточности. Мои грабли. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.047 c