Curl, pętla i thread
Ostatnio zmodyfikowano 2016-11-24 22:31
MSSC Temat założony przez niniejszego użytkownika |
Curl, pętla i thread » 2016-11-24 21:30:54 Witam
Otóż naskrobałem mały programik, tworzy on 2 thread'y i w jednym pobiera plik html i wyświetla ją (curl) a drugi w tym samym czasie wypisuje w pętli tekst. Moja pętla główna wygląda następująco:
while (1 == 1) { tekst.join(); curl.join();
... Wypisywanie bzdur ...
Sleep(1000); system("cls"); }
I problem z tym programem jest taki, że pętla wykonuje się raz, po czym wywala błąd "Unhandled exception at 0x74A9A6F2 in Consolmium.exe: Microsoft C++ exception: std::system_error at memory location 0x008FF890.". Używając debuggera doszedłem do tego, że wywalenie występuje w momencie dojścia do tekst.join(); w drugim obiegu pętli, a po wyrzuceniu go z kodu wywala w tym samym momencie przy curl.join();. Logika podpowiada mi, że coś nie tak jest z threadsami, ale detach(); nie pomaga. Pomocy? |
|
Monika90 |
» 2016-11-24 21:53:15 join można wywołać tylko raz dla danego wątku, wywoływanie join w pętli nie ma sensu. |
|
MSSC Temat założony przez niniejszego użytkownika |
» 2016-11-24 21:55:45 Już do tego szczerze doszedłem ;). Pojawił się z kolei inny problem, jak pod koniec pętli zniszczyć te wątki, by je potem znów bez problemów zainicjować? |
|
Monika90 |
» 2016-11-24 22:16:55 Programowanie wielowątkowe jest bardzo trudne, wątków należy unikać jak wody święconej. Jeżeli naprawdę nie masz wyboru i musisz użyć wątków, to nie zabieraj się do tego nie przeczytawszy najpierw książki, np. "C++ Concurrency in Action" Anthony'ego Williamsa.
|
|
MSSC Temat założony przez niniejszego użytkownika |
» 2016-11-24 22:21:13 Bardzo chętnie, ale na razie chyba muszę sobie poradzić bez niej...
Znalazłem dekonstruktor, jest to ~thread(); ale VS2015 wywala błąd przy tyldzie... |
|
Monika90 |
» 2016-11-24 22:31:24 Po powrocie z join można na nowo zainicjować obiekt thread, np.: int main() { std::thread t( func ); t.join(); t = std::thread( func ); t.join(); }
|
|
« 1 » |