Od c++ 11 wprowadzono fajnie działającą klasę thread.
Jest ona banalna w obsłudze.
Tworzysz obiekt klasy std::thread
#include <iostream>
#include<thread>
using namespace std;
void func()
{
cout << "FUNKCJA" << endl;
}
int main() {
thread thrd(func);
//TUTAJ SOBIE LECI KOD JAK SE CHCESZ. WATEK JUZ DZIALA
thrd.join();
}
A więc tak.
- Zdefiniowałem sobie funkcję która trzeba dać do argumentu.
- Stworzyłem nowy obiekt klasy std::thread, o nazwie thrd.
- Jako argument konstruktora użyłem nazwy funkcji którą ma wykonać w osobnym wątku
- W momencie użycia metody "thrd.join()" główny wątek czeka na dokończenie wątku thrd po czym jedzie dalej.
Aby przekazać jakieś argumenty do funkcji którą chcemy przekazać do konstruktora std::thread należy:
#include <iostream>
#include<thread>
using namespace std;
void func(int value)
{
cout << "FUNKCJA " << value << endl;
}
int main() {
thread thrd1(func, 1);
thread thrd2(func, 2);
thread thrd3(func, 3);
//TUTAJ SOBIE LECI KOD JAK SE CHCESZ. WATEK JUZ DZIALA
thrd1.join();
thrd2.join();
thrd3.join();
return 0;
}
Argumenty funkcji podajemy po argumentowanej funkcji, po przecinkach.
Możesz też chcieć przerwać w działanie funkcji(wątku) w momencie w którym program dojdzie do metody thrd.join();
Wystarczy zamiast join() wywołać metodę thrd.detach();
Wtedy wątek automatycznie przerywa działanie, nie ważne co robiąc, a program lecie dalej z kodem.
Generalnie tyle powinno ci wystarczyć na start. Resztę możesz już doczytać w dokumentacji.
PS. Jeżeli chcesz mieć wątek w klasie, a funkcją wątka jest metoda tej klasy to musisz to zrobić tak:
nazwaObiektuKlasyThread(&NazwaKlasy::nazwaMetody, this);
Piszę to, ponieważ mi samemu sporo zajęło żeby to ogarnąć.