Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > .NET Languages
You last visited: Today at 22:24

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Parallel For Problem

Discussion on Parallel For Problem within the .NET Languages forum part of the Coders Den category.

Reply
 
Old   #1
 
Ludder231's Avatar
 
elite*gold: 0
Join Date: Aug 2010
Posts: 880
Received Thanks: 113
Parallel For Problem

Hi,

es kennen vielleicht einige das Problem, dass mit einer Parallel For die Fehlermeldung "Die Auflistung wurde geändert" bekommt.

In der Prarallel For wird auf eine webseite connected und dort per regex daten ausgelesen und dann ein objekt gefüllt. dieses objekt wird einer list<> hinzugefügt.

Wie kann ich den Fehler verhindern?

Ludder231 is offline  
Old 06/11/2018, 12:03   #2
 
elite*gold: 67
Join Date: Aug 2014
Posts: 1,321
Received Thanks: 927
zb mit lock

Wenn du es richtig machen willst solltest du googlen
Xio. is offline  
Thanks
1 User
Old 06/11/2018, 15:22   #3
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 572
Wenn du threading verwendest solltest du dir vorher wenigstens durchlesen was Racing conditions sind, wie Critical Sections (locks), Barriers, Mutexe, etc funktionieren. Ich weiß das in .Not Threading sehr einfach umzusetzen ist, das heißt aber trozdem nicht das es einfach ist. Bei Threading musst extrem aufpassen, denn fehler aufgrund von Racing Conditions zu finden ist extrem wiederlich (und z.T. extrem schwer bis unmöglich im debugger zu finden).

Ein einstieg dafür ist: .

In deinem Fall muss ja nur das HTTP webrequest parallelisiert werden, der rest kostet ja keine Zeit. Das heißt man kann den restlichen code serialisieren, z.B. mit einer Barrier
Code:
Parallel.For(...
  html = ...
  barrier[i].SignalAndWait();
  // no other of the working threads is currently running this section, and mainthread is also paused
  ...
  retHorse.AddData(h);
  barrier[i].SignalAndWait();
}); // for end
for (int i=0; i<barrier.length; i++) {
  barrier[i].SignalAndWait(); // Wait for webrequrest
  barrier[i].SignalAndWait(); // Wait for List addition
}
Du könntest auch eine Lock verwenden (ist wahrscheinlich sogar simpler) dabei kannst du aber nicht über das scheduling bestimmen. Mit Barriers übernimmt der Mainthread die aufgabe des Lock schedulings (was man eventuell haben möchte oder auch nicht). In diesem fall werden die threads aufsteigend gescheduled.

PS: Da eventuell exceptions auftreten können ist ein Try-Finally für die Barrier locks empfehlenswert
warfley is offline  
Thanks
1 User
Old 06/11/2018, 15:57   #4
 
Ludder231's Avatar
 
elite*gold: 0
Join Date: Aug 2010
Posts: 880
Received Thanks: 113
Danke schon mal. Bräuchte ich nicht sogar schon vor der html-variable ein lock/barrier weil es ja sonst möglich ist das zu einem Pferd die falsche html Seite geparsed wird weil sie von dem nachfolgendem Thread überschrieben wird weil der aktuelle Thread länger dauert weil die Webseite mal nicht so schnell antwortet?
Ludder231 is offline  
Old 06/11/2018, 16:23   #5
 
elite*gold: 0
Join Date: Feb 2009
Posts: 1,137
Received Thanks: 572
Quote:
Originally Posted by Ludder231 View Post
Danke schon mal. Bräuchte ich nicht sogar schon vor der html-variable ein lock/barrier weil es ja sonst möglich ist das zu einem Pferd die falsche html Seite geparsed wird weil sie von dem nachfolgendem Thread überschrieben wird weil der aktuelle Thread länger dauert weil die Webseite mal nicht so schnell antwortet?
Stimmt das habe ich gar nicht gesehen. Das lässt sich aber ganz einfach lösen, definiere html einfach als lokale variable im for.
Lokale variablen werden auf den Stack gepusht, und jeder Thread hat seinen eigenen thread. Globale Variablen und der Heap sind geshared, daher alles was dein thread nicht selbst erzeugt ist eine potentielle gefahr.
Wenn du das Lock vor das HTML machst, dann führst du serialisiert die threads aus, das ist das selbe als würdest du ein normales for nehmen, nur mit mehr overhead. (also insgesammt eine eher schlechte Idee)

Genau das meinte ich mit Multithreading ist zwar einfach umzusetzen aber trozdem nicht leicht. Dein fall ist noch recht einfach, da du einfach html lokal definieren kannst, aber wenn du auf mehrere globale daten zugreifen musst, desto mehr locks benötigst du und dann kommt plötzlich noch die möglichkeit für Deadlocks, wenn Thread 1 auf Lock 1 wartet aber das erst von Thread 2 gelöst werden kann der auf Lock2 wartet was von Thread 1 gehalten wird.
warfley is offline  
Thanks
1 User
Old 06/11/2018, 17:26   #6



 
Serraniel's Avatar
 
elite*gold: 2222
The Black Market: 204/1/0
Join Date: May 2010
Posts: 6,851
Received Thanks: 5,106
Alternativ ne ConcurrentList verwenden, bei der u. A. das Hinzufügen von Elementen Threadsafe ist (ich nehme an, dass das Verändern der Liste den Fehler verursacht?):
Serraniel is offline  
Reply


Similar Threads Similar Threads
# PAE parallel zu IPFW #
12/26/2010 - Metin2 Private Server - 0 Replies
So ich hab hier ein technisches Problem. Ich hab jetzt nun beide Kernel Kompiliert PAE und IPFW. Nund hab ich ein Problem. Entweder ich installier den PAE dan geht die Firewall nicht mehr Bei nur PAE und ipfw list
parallel+serielle schaltung HELP ME PLS
10/30/2010 - Main - 2 Replies
kann mir jm die parallel+serielle schaltung pls erklären??? wär euch sehr dankbar, denn ich kenne mich so gut wie nicht aus
2x Bots parallel laufen lassen - Frage
10/09/2010 - Diablo 2 - 3 Replies
Wenn ich jetzt 2x Hdin parallel laufen lassen möchte als Bot, Muss ich die Charconfig _ Paladin _ Charname x 2 haben? Sind ja logischerweise 2x verschiedene Charaktere.
mac x using parallel desktop
04/09/2007 - Conquer Online 2 - 0 Replies
can any1 help me um im using mac x using parallel desktop so i can run windows when i finish install i try to run conqueronline but it give me this error Conquer.exe has encountered a problem and needs to close.we are sorry for the inconvenience not only that i only open one client can any1 help me <hr>Append on Apr 10 2007, 01:22<hr> any1 can help me? <hr>Append on Apr 10 2007, 03:34<hr> pls! help me i really want to play using mac cuz i sold my pc thats why i need ur advise any1 can...
[Frage] 2 Ragnarokfesnter parallel???
03/05/2005 - Ragnarok Online - 12 Replies
Hallo Leute, erstmal möchte ich euch wegen diesem Forum gratulieren, ist echt geil ^^. Jetzt zu meiner Frage. Ist es möglich, Ragnarok 2 mal geichzeitig mit verschiedenen Account paralell laufen zu lassen? Würde mich auf eine Antwort sehr freuen. MfG Annonym ^^



All times are GMT +1. The time now is 22:24.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.