Wiele wątków sortujące tablice

0

Moim celem jest napisanie programu który posortuje 10 tablic wielowątkowo.
Podaje mu ilość wątków, następnie każdy wątek sortuje jedna tablice, po posortowaniu zabiera się za kolejna i aż do końca.

Mam problem własnie z "zabieraniem się za kolejną"

Ta część kodu ma za zadanie właśnie utworzenie określonej ilości wątków, a po zakończeniu pracy któregoś z nich dać mu kolejna tablicę

Funkcja ma na celu zwrocenie indeksu watku ktory sie juz skonczyl

int Test2::getThreadIndex(HANDLE* handle,int size){
	for(int i = 0;i<size;i++){
		if(WaitForSingleObject(handle[i],0)==WAIT_OBJECT_0)
			return i;
	}
} 

alreadySorted - ile tablic jest już posortowanych
threadCount - ilość jednocześnie pracujących wątków
hsC - tablica HANDLE'row z watkami
temp - HANDLE tymczasowy

	for(int i = 0;i<threadCount;i++){ //tworze okreslona ilosc watkow
		hsC[i] = (HANDLE)_beginthreadex(NULL, 0, threadBubble, (void*) testC[i], 0, 0);
		alreadySorted+=1; //po ich wykonaniu bede miec "tyle" posortowanych tablic
	}
	while(1){
  		//jesli dostane timeouta znaczy ze jeszcze zaden watek sie nie skonczyl
		if(WaitForMultipleObjects( 1, & hsC[0], FALSE,0)==WAIT_TIMEOUT) 
			WaitForMultipleObjects( 1, & hsC[0], FALSE, INFINITE );//wiec czekam az ktorykolwiek sie skonczy
		temp = getThreadIndex(hsC,threadCount); //pobieram indeks skonczonego watku
		if(alreadySorted!=10)
		{	//i uruchamiam kolejny
			hsC[temp] = (HANDLE)_beginthreadex(NULL, 0, threadBubble, (void*) testC[alreadySorted], 0, 0);
			alreadySorted += 1;
		}
		else //jesli mam 10 tablic posortowanych koniec
			break;
	}	//i czekam aż reszta wątków się skończy
		WaitForMultipleObjects(threadCount-1, &hsC[0],TRUE,INFINITE);

Niestety wynikiem tego programu jest to ze na początku faktycznie tworzy x wątków ale nowe watki tworzy dopiero po skończeniu pracy tych x wątków a nie po skończeniu pracy któregokolwiek z nich

0

Jeżeli dany wątek zakończył swoje zadanie a są jeszcze jakieś tablice do posortowania, to powinieneś wykorzystać ten wątek do posortowania kolejnej tablicy.
Ja bym to zadanie zrealizował tak:

  const int tabsNumber = 20;
  const int thredsNumber = 5;

  std::vector<int> tabs[tabsNumber];
  std::thread threads[thredsNumber];

  std::atomic<int> counter(0);
  for (std::thread& thread : threads)
  {
    thread = std::thread([&]
    {
      int c;
      while (--(c = ++counter) < tabsNumber)
        std::sort(tabs[c].begin(), tabs[c].end());
    });
  }

  for (std::thread& thread : threads)
    thread.join();
0
Pebal napisał(a):

Jeżeli dany wątek zakończył swoje zadanie a są jeszcze jakieś tablice do posortowania, to powinieneś wykorzystać ten wątek do posortowania kolejnej tablicy.

Właśnie do tego dążę cały czas =]. Ale nie wiem czemu po zakonczeniu pracy jednego z kilku wątków czeka on na zakończenie pozostałych
przecieŻ tą częścią kodu powinienem zagwarantowac uruchomienie wątku po zakonczeniu jakiegokolwiek

 if(WaitForMultipleObjects( 1, & hsC[0], FALSE,0)==WAIT_TIMEOUT) //1*
                        WaitForMultipleObjects( 1, & hsC[0], FALSE, INFINITE ) //2*

*1 sprawdza czy jakikolwiek jeden wątek (z tablicy uchwytow do tych wątkow) ma stan zakonczony zakonczyl
*2 jesli nie to czeka az ktorykolwiek się zakonczy (Waitformultipleobject oczekuje na zakonczenie x(pierwszy argument) watkow z tablicy (2 argument) handlerow

czyli jesli w w/w ifie wartosc bedzie true to znaczylo by ze ktorys juz sie zakonczyl i w dalszej czesci kodu wyluskuje jego index i na nim uruchamiam kolejne sortowanie
natomiast jersli == timeout (czyli jeszcez zaden sie nie skonczyl) przechodze do kolejnego waita ktory czeka az jakis sie zakonczy i wtedy znow przechodzi dalej do uruchamiania sortowania

nie wiem czemu to nie dziala i dlatego pytam o rade lub pomoc w znalezieniu niedociagniecia w kodzie

0
WaitForMultipleObjects( 1, & hsC[0], FALSE,0)

W powyższym sprawdzasz tylko pierwszy wątek a nie jeden z wielu. Raczej powinno być:

WaitForMultipleObjects(threadCount, & hsC[0], FALSE,0)

Poza tym, nie wykorzystujesz wątku, który skończył pracę do posortowania kolejnej możliwej tablicy. Gdy wątek kończy pracę Ty tworzysz w jego miejsce nowy wątek, a to nie jest to samo. Zwróć uwagę, że jeżeli masz 200 tablic to tworzysz 200 wątków, choć tylko kilka działa w tym samym czasie.

0

ahh faktycznie źle zrozumiałem opis argumentów tej funkcji
dziękuje za wskazówkę

mógłbym jeszcez zapytac jaką funkcja zastąpić _beginthredex aby wyslac nowe argumenty do juz istniejacego wątku i wystartować go ponownie ?

0

Po zagłębieniu w temat widzę jak bezsensowne jest to pytanie :P
Jakby ktoś czytał i szukał odpowiedzi, to w moim przypadku wystarczyło dodać statyczną zmienna do struktury, przekazywanej jako argument do wątku, która wskazywała na tablice następna w kolejce do sortowania.

Dziękuje za pomoc
Temat do zamknięcia

0
Urso napisał(a):

w moim przypadku wystarczyło dodać statyczną zmienna do struktury, przekazywanej jako argument do wątku, która wskazywała na tablice następna w kolejce do sortowania.
Że co?
A jak jest trzy tablice do posortowania dla jednego wątku to co robić z trzecią?
A jak dwa wątki i 4 tablice po jednej rozdajesz trzecią podpinasz pod składową statyczną zaś co z czwartą?

0

Źle mnie zrozumiałeś, a raczej źle się wyraziłem. Nie miałem na myśli, że ta zmienna to wskaźnik na kolejną tablice, tylko że będzie ona określać kolejna tablice do posortowania.
Wszystkie tablice sa w dużej tablicy.
Zmienna statyczna to zwykły int, który jest zwiększany w sekcji krytycznej po każdorazowym uruchomieniu wątku, bądź nowego sortowania.
Następnie w wątku sprawdzane jest w pętli, czy ten właśnie int jest równy ilości tablic do posortowania. Jeśli tak, to kończy dany watek jeśli nie sortuje kolejna tablice o indeksie obliczonym z tego inta i zwiększa go.
Przykład:
4 tablice 2 wątki.
Na start uruchamiane są 2 wątki, więc zmienna statyczna = 2
Po przesortowaniu, niezależnie który watek skończy pierwszy, sprawdza on zmienną statyczną, jest = 2, więc zwiększa ją o 1 i uruchamia kolejne sortowanie.
No i znowu, niezależnie który wątek skończy, to sprawdza on czy zmienna jest = 4, nie jest wiec zwiększa ja (do 4) i uruchamia kolejne (już czwarte) sortowanie.
Mamy 2 watki każdy po skonczonym sortowaniu sprawdzi static inta, zobaczy że = 4 i zakończy działanie.

0

Tylko po kiego statyczna? Jeżeli zechcesz puścić to samo w okienku obok to już - nic z tego.

0

Każdy wątek ma inną strukturę, a statyczna zmienna będzie wspólna dla wszystkich. Jakikolwiek watek zmieni ja w swojej strukturze, to zmieni ja również we wszystkich innych
i stąd inne watki będą wiedziały, która tablica jest kolejną do przesortowania.
Nie mam, ani nie będę mieć potrzeby odpalania tego w okienku obok.

0

Kiedy programista zaczyna wiedzieć wszystko na temat przyszłości aplikacji którą właśnie pisze to oznacza koniec tego programisty lub/oraz koniec tej aplikacji.

0

w tym wypadku koniec aplikacji gdyz jest to program na zaliczenie do ktorego nigdy wiecej nie wróce

1

@Urso niestety ale marny z ciebie będzie programista. Bo jeśli teraz tak robisz to później w pracy też tak będziesz robił, bo tak się nauczysz. Jesli juz teraz piszesz kod na zasadzie "byle zadziałało, a nawet jak jest napisane źle i nasrane w kodzie, to bez znaczenia" to taką samą filozofię będziesz stosował później w pracy zawodowej. Może się okazać że trafisz do dobrego zespołu i będą ci revertować kod po każdym code-review i wysyłać upomnienia z CC do całej firmy i może się wyrobisz. Niestety może też być tak że nikt nie będzie kontrolował co komitujesz i wtedy pewnego dnia któryś z programistów, którzy będą pracować na kodzie który napisałeś, dopadnie cię w ciemnej uliczce i zabije.
Ucz się pisać porządny kod! No chyba że chodzisz na kurs do nich: http://kosciak.blox.pl/resource/czas_dev.jpg

0

Myślałem, że to forum jest od pomocy z programowaniem, a nie z ocenianiem ludzi po tym jakie pytanie zadają.
Z praca którą mam aktualnie ledwo starcza mi czasu na studia wiec nie mam zamiaru poświęcać cennego czasu na pisanie aplikacji, za która nie zależnie jak napisanej nie dostane nic więcej niż zal.

Dziękuje wam serdecznie za pomoc i o nic więcej nie prosze.

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