Watki i przekzanie wskaznika do "dużego" obiektu

0

Kolejny mój problem - cegiełka do rozwiązania jest z przekazywanie w C# wskaźników "ala" C++ np TStringList *myList ;
Fragment kodu w C#:

 
List<string> myList = new List<string>();
// Zaladowanie z pliku 100 MB linii danych do obiektu myList

for (int jj = 0; jj < 10; jj++)
{
	Neworker worker = new Neworker();
	worker.myListW = myList; // 10 razy przekopiowanie obiektu ~ 1GB zajętej RAM 
	Thread th = new Thread(new ThreadStart(worker.RobWatku));
	th.Start();
}

Jeśli w 10 watkach kod będzie pracował na liście danych np adresów do sprawdzenia wielości 100 MB plik w powyższym kodzie nastąpi przekopiowanie 10 x tej samej listy danych czyli zajęcie niepotrzebnej pamięci, bo lista myList ma być tylko do odczytu....

Pytanie jak w C# zrealizować takie przekazie na zasadzie wskaznika do obiektu, anie kopiowania tego obiektu do "watka" ?
Prosił bym o ile można o przykładowy poglądowy kod w C#.

0

w C# klasy (class) są przekazywane przez referencję, więc w twoim kodzie nie ma żadnego kopiowania.

jest natomiast inny problem, wynikający z wielowątkowości.
ponieważ różne wątki operują na tym samym obiekcie, przyda się słowo kluczowe lock.

http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

0
Azarien napisał(a):

w C# klasy (class) są przekazywane przez referencję, więc w twoim kodzie nie ma żadnego kopiowania.

Czyli mam rozumieć jeśli w umownym jednym z 10 ciu wątków, watek np wykasuje cześć przekazanej mu listy to zmiana ta będzie dotyczyć wszystkich wątków do których na starcie była przekazana lista ?

Azarien napisał(a):

ponieważ różne wątki operują na tym samym obiekcie, przyda się słowo kluczowe lock.

Ale w tym wypadku tylko w kwestii odczytu danych z obiektu myListW , więc uważam, że lock czy też mutex jest niepotrzebny.

Czyli jeszcze raz bo muszę się upewnić czy dobrze rozumiem :)

  • Jeśli przekazuję listę w ten sposób do 10 "wątków" nie jest ona kopiowana - **TAK **?
  • Jeśli jedne z 10 wątków zmieni jej stan to ten będzie automatycznie zmieniony dla wszystkich 9 pozostałych wątków do których obiekt myList został przy ich uruchomieniu przekazany - TAK ?
0

Czyli mam rozumieć jeśli w umownym jednym z 10 ciu wątków, watek np wykasuje cześć przekazanej mu listy to zmiana ta będzie dotyczyć wszystkich wątków do których na starcie była przekazana lista ?
Tak.

Ale w tym wypadku tylko w kwestii odczytu danych z obiektu myListW , więc uważam, że lock czy też mutex jest niepotrzebny.
No okej, ale czy masz pewność że odczyt z listy nie powoduje jakiegoś ukrytego zapisu? chyba nie, bo w C# nie ma pojęcia „const correctness”.

  • Jeśli przekazuję listę w ten sposób do 10 "wątków" nie jest ona kopiowana - TAK ?
    Nie ważne, czy do wątków czy nie. Przekazanie obiektu klasy w C# nie powoduje kopiowania obiektu. To tak jakby wszędzie wszystko bylo przekazywane przez referencję (czyli jako & w C++).
  • Jeśli jedne z 10 wątków zmieni jej stan to ten będzie automatycznie zmieniony dla wszystkich 9 pozostałych wątków do których obiekt myList został przy ich uruchomieniu przekazany - TAK ?
    Dlaczego nie sprawdzisz? ;-)

w C# typy dzielą się na "reference types" i "value types".
Pierwsze przekazywane są przez referencję, i są to klasy, stringi, tablice.
Drugie przekazywane są przez wartość, i są to: typy proste (int, double), enumy, struktury.

0

Właśnie sprawdzałem i przyznam, że jestem zdziwiony, bo nigdy bym nie przepuszczał, że tak właśnie będzie działać .... czuję, że jeszcze nie jedna niespodzianka mnie czeka w C# :)

**Dziękuje za pomoc! **

1 użytkowników online, w tym zalogowanych: 0, gości: 1