Dwa wątki jednocześnie

Dwa wątki jednocześnie
HX
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 3 lata
  • Postów:46
0

Witam.
Mam pytanie czy w c++ da się robić 2 rzeczy naraz ?
Są do tego jakieś biblioteki albo coś ?

szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:9 dni
  • Lokalizacja:Kraków
  • Postów:1694
HX
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 3 lata
  • Postów:46
0

A jakiś przykładowy kod podasz ?

hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:13 dni
0

Przy czym pamiętaj, że nawet to co podał kolega @szweszwe nie gwarantuje, że rzeczy rzeczywiście będą się wykonywać jednocześnie, jedynie z punktu widzenia Twojego kodu rzeczy będą się wykonywać "równolegle", ale gwarancji na to nie masz.


HX
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 3 lata
  • Postów:46
0

Dlatego proszę o przykładowy kod żeby się przekonać

superdurszlak
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Kraków
  • Postów:2000
1

Nie obracam się raczej w świecie C++, ale możesz skorzystać np.

  • z wątków POSIX (pthreads)
  • z wątków które weszły bodajże w standardzie C++11, a wcześniej były chyba w Boost
  • jak chcesz naprawdę duuuuużo wątków, możesz spróbować powalczyć z OpenCL. Jak napiszesz kernel i zapuścisz go sobie na GPU, to prawie na pewno program będzie robił 32 i więcej rzeczy jednocześnie. Jest tylko mały kruczek: jednocześnie będzie robione 32 i więcej tych samych rzeczy, na różnych danych. Grupa SIMD/SIMT/warp/wavefront na GPU działa w synchronizacji sprzętowej, więc zawsze robią to samo, chyba że część nie robi nic (bo dla niektórych danych jakiś if się nie wykona i wątki będą mieć puste przebiegi, podczas gdy inne będą wykonywać tego ifa)

edytowany 3x, ostatnio: superdurszlak
YooSy
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 5 lat
  • Postów:472
1
Kopiuj
#include <future>
#include <thread>
#include <iostream>
#include <string>
#include <chrono>

using namespace std::chrono_literals;

void Print(const std::string& str) {
	for (std::size_t i = 0; i < 100; ++i) {
		std::cout << str << ' ';
		std::this_thread::sleep_for(100ms);
	}
}

void Func1() {
	Print("fn1");
}

void Func2() {
	Print("fn2");
}

int main() {
	std::future<void> ftr(std::async(Func1));
	Func2();

	return 0;
}

https://wandbox.org/permlink/bGKeEJugpSZ5iUTF

Jak widać w wydruku, wypisanie danych nie jest naprzemienne z obu funkcji, tylko czasem jedna z nich wykonuje dwa obroty pętli.
A to czy coś wykona się równolegle zależy od tego czy system przydzieli jakieś wolne wątki do obsługi zadania. W skrajnym przypadku
funkcje mogą wykonać się jedna po drugiej.


Nie pisz na priv. Zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: YooSy
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Najprosciej to przez OpenMP. W drugiej kolejnosci ew watki ze standardu c++11.

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.