Moje pierwsze wątki C++

0

Witam, jestem na forum od nie dawna.
Napisałem prosty program dodający i odejmujący w wątkach.
Jeden wątek odejmuje podane liczby a drugi dodaje.
W związku z tym mam kilka pytań...
Czy rzeczywiście te dwa działania są obliczane jednocześnie.
Jakbym mógł wyniki działań wątków przekazać do int main()?
Proszę o wyrozumiałość.
Zaczynam dopiero wielowątkowe przygody.

#include<iostream>
#include<thread>
using namespace std;

void odejmowanie(int a, int b)
{
	cout << "watek odejmujacy" << endl;
	cout << "a = "<< a << " | b =  " << b << endl; //sprawdzam czy zmienne został przekazane
	cout << "Wynik = " << a-b << endl;
		
}

void dodawanie(int a, int b)
{
	cout << "watek dodajacy" << endl;
	cout << "a = "<< a << " | b =  " << b << endl; //sprawdzam czy zmienne zostały przekazane
	cout << "wynik = " << a+b << endl;	
}

int main()
{
	int a,b,c;
	cout << "podaj a: " << endl;
	cin >> a;
	cout << "podaj b: " << endl;
	cin >> b;
	
	
	thread t1(odejmowanie, a, b);
	t1.join();
	cout << "Watek odejmujacy wykonal prace" << endl;
	
	 
	
	thread t2(dodawanie, a, b);
	t2.join();
	cout << "watek dodajacy wykonal prace" << endl;
	
} 
2

Nie są wykonywane jednocześnie. Poprzez wywołanie join wstrzymujesz obecny wątek aż wątek, na którego obiekcie wywołałeś tę metodę nie zakończy działania.

0

Usunąłem t1.join(), program wykonał działanie a następnie System Windows wyrzucił błąd.
Bardzo proszę o jakieś wyjaśnienie jakbym mógł inaczej to zrobić. Zależy mi niezmiernie na wykonywaniu dwóch wątków jednocześnie.

1

Musisz poczekać aż wątek się zakończy. Ale nie musisz czekać od razu. Przenieś wywołania join na koniec funkcji main.

Przy czym wątek jako taki jest dość niskopoziomową abstrakcją. Co konkretnie chcesz osiągnąć?

0

Przeniosłem oba join na koniec funkcji main().
Teraz jak program jest wyświetlany w konsoli to wygląda jakby oba wątki działały jednocześnie.
Cel może być bez sensowny...Po prostu muszę napisać jakiś prosty program wykorzystujący wątki na zaliczenie semestru.
Też z własnej ciekawości chciałbym sprawdzić jakby wyglądało wykonywanie obu wątków jednocześnie.

0

Teraz chyba osiągnąłem mój zamierzony cel:

#include<iostream>
#include<thread>
using namespace std;

void odejmowanie(int a, int b, int* wsk1)
{

	cout << " watek odejmujacy " << endl;
	*wsk1=a-b;
}

void dodawanie(int a, int b, int *wsk)
{

	cout << " watek dodajacy " << endl;
	*wsk=a+b;	
}

int main()
{
	int a,b,wynik1,wynik2;
	cout << "podaj a: " << endl;
	cin >> a;
	cout << "podaj b: " << endl;
	cin >> b;
	
	
	thread t1(odejmowanie, a, b, &wynik1);
	thread t2(dodawanie, a, b, &wynik2);
	
	
	t1.join();
	t2.join();
	cout << "Watek odejmujacy wykonal prace, jego wynik to: " << wynik1 << endl;
	cout << "watek dodajacy wykonal prace, jego wynik to: "<< wynik2 << endl;
1

Jak chcesz zwrócić wynik z wątku to masz kilka możliwości:

  1. Użyć std::future (wątek musi wtedy zwracać obiekt std::promise lub możesz użyć std::async, aczkolwiek powinieneś być ostrożny z tym) - poczytaj w dokumentacji
  2. Możesz opakować te wątki w klasie, która będzie miała jakieś pola do przechowywania danych wynikowych
  3. Możesz przekazać wynik do innego obiektu, do którego referencję podasz jako argument funkcji wykonywanej przez wątek
  4. Możesz wysłać wynik przez socket, a inny wątek może sobie te dane odebrać
  5. (niezalecane) możesz ustawic wynik w jakiejś globalnej zmiennej

Jest jeszcze kilka sposobów, ale tyle powinno Ci wystarczyć do tego zadania

1

nie jestem pewien co mowi o tym standard, ale z doswiadczenia, pisanie do tej samej konsoli bez synchronizacji z kilku watkow nie zawsze jest bezpieczne.

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