Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.6 MB
Время: 0.054 c
1-1101672773
Донской
2004-11-28 23:12
2004.12.12
Код raise.exception.create не генерит ошибки!!


14-1101192856
passlight
2004-11-23 09:54
2004.12.12
Сбойная память : способы использования


14-1100831566
ИМХО
2004-11-19 05:32
2004.12.12
Роман с камнем, мелодия


3-1100495043
Explorer
2004-11-15 08:04
2004.12.12
Учет документации


1-1101608757
Bobby Digital
2004-11-28 05:25
2004.12.12
Listbox pt.2





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский