std::thread a CreateThread porównanie szybkości

std::thread a CreateThread porównanie szybkości
S6
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 8 lat
0

Po korekcie...
Sprawdzałem czy są jakieś różnice różnice w czasie działanie programu w zależności od sposobu tworzenia wątków.
W moim programie do wyszukiwania twarzy na zdjęciu używam wielowątkowości.
Środowisko testu: System Windows 10 64-bit, Kompilator Visual Studio Express 2015, kompilacja kodu C++ 64-bitowa.
Tworzę tam tablicę wątków i rozdzielam zadania po równo każdemu wątkowi.

Oto 2 sposoby tworzenia N wątków:

1. Przez CreateThread() z WinPI

Kopiuj
HANDLE gTabThreadHandle[g_MaxLWatkow];
g_LUruchomionychWatkow = N;
for (i = 0; i < N - 1; ++i) //pętla od 0 do N-2
{ gTabNry[i] = i; 
  gTabThreadHandle[i] = CreateThread(NULL, 0, &FunWatek, (void *)&gTabNry[i], 0, &tid); //tworzę i od razu uruchamiam wątek
}
FunWatek(&gTabNry[N - 1]); //ostatni niby-wątek uruchamiam w głównym procesie

//Po utworzeniu wsz. wątków czekam na ich zakończenie
while (g_LUruchomionychWatkow > 0) Sleep(10); 

2. Przez std::thread z C++11

Kopiuj
std::thread gTabThread[gMaxDozwLWatkow];
g_LUruchomionychWatkow = N;
for (i = 0; i < N - 1; ++i) //pętla od 0 do N-2
{ gTabNry[i] = i; 
  gTabThread[i] = std::thread(FunWatek, (void *)&gTabNry[i]);
}
FunWatek(&gTabNry[N - 1]); //ostatni niby-wątek uruchamiany w procesie

//Po utworzeniu wsz. wątków czekam na ich zakończenie
for (i = 0; i < N - 1; ++i) gTabThread[i].join(); 

I taka tam funkcja wątkowa:

Kopiuj
DWORD WINAPI FunWatek(void *Arg)
{ int NrWatka = *((int*)Arg); //nr wątka
  ProceduraWatka(NrWatka);
  g_LUruchomionychWatkow--; //reduce the count
  return 0;
}

Otóż nie zauważyłem większych różnic w czasach działania programu między tymi dwoma sposobami tworzenia wątków.
Jednak użycie biblioteki #include <thread> dla std::thread zwiększyło 2 razy kod binarny programu (o 210 KB).
Natomiast użycie std::thread ułatwia pisanie aplikacji na różne systemy, tzw. portable code.


Mathematics is the language of nature.
edytowany 7x, ostatnio: sator6
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Szczecin
1

x.join() nie uruchamia wątku x, tylko blokuje obecny aż do zakończenia x. http://en.cppreference.com/w/cpp/thread/thread/join

Trochę słaby ten benchmark. Nie podałeś kodu... Zaraz się jeszcze okaże, że porównujesz wersje debug...

Swoją drogą: po co ta zabawa z new?


edytowany 1x, ostatnio: kq
S6
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 8 lat
0

No tak, źle użyłem .join i stąd te różnice w czasach. Mój błąd. Treść wątku poprawiłem albo można go usunąć.


Mathematics is the language of nature.
edytowany 2x, ostatnio: sator6

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.