Witam!
Ostatnio napisałem program do pewnych symulacji fizycznych. Jak to bywa w tego typu programach, potrzebna jest duża moc obliczeniowa. Ponieważ dotychczas obliczeniami zajmował się jeden rdzeń procesora (posiadam dwurdzeniowy), postanowiłem sprawdzić jaki będzie wzrost wydajności, jeśli podzielę obliczenia na dwa równoległe wątki.
Powiedzmy, że tworzenie wątków oraz ogólna idea semaforów i mutexów nie jest mi obca. Problem niestety mam we właściwym zastosowaniu tych mechanizmów, aby obliczenia przebiegały w sposób sensowny i zsynchronizowany. Ma to wyglądać mniej więcej tak:
Wątek główny (funkcja main) zajmuje się jedynie odrysowaniem danego stanu, przy czym może to zrobić tylko po zakończeniu cyklu obliczeń przez independentx. Jeśli nie może, to czeka nie marnując zasobów. Obliczenia mogą się ciągnąć wieki lub wykonywać błyskawicznie - tak czy siak wątek, który skończy wcześniej nie może przejść do następnego etapu obliczeń, dopóki drugi też nie skończy tego samego etapu. Na wyjściu w konsoli dla powyższego przykładu chciałbym otrzymać np. coś takiego:
Próbowałem na różne sposoby stosować semafory bądź mutexy, ale zawsze kończyło się to albo deadlockiem, albo wątki się rozbiegały w obliczeniach. Może mi ktoś pomóc, jak rozmieścić te "waity i posty", żeby wszystko działało jak należy?
Ostatnio napisałem program do pewnych symulacji fizycznych. Jak to bywa w tego typu programach, potrzebna jest duża moc obliczeniowa. Ponieważ dotychczas obliczeniami zajmował się jeden rdzeń procesora (posiadam dwurdzeniowy), postanowiłem sprawdzić jaki będzie wzrost wydajności, jeśli podzielę obliczenia na dwa równoległe wątki.
Powiedzmy, że tworzenie wątków oraz ogólna idea semaforów i mutexów nie jest mi obca. Problem niestety mam we właściwym zastosowaniu tych mechanizmów, aby obliczenia przebiegały w sposób sensowny i zsynchronizowany. Ma to wyglądać mniej więcej tak:
int independent1(void* data)
{
while(1)
{
SDL_Delay(rand()%1500 + 500); // Bardzo długie obliczenia ;)
printf("Thread 1: Wykonano obliczenia.\n");
}
}
int independent2(void* data)
{
while(1)
{
SDL_Delay(rand()%1500 + 500);
printf("Thread 2: Wykonano obliczenia.\n");
}
}
int main(int argc, char *argv[])
{
...
/* Mniej wazne sprawy, tj. tworzenie watkow itp. */
...
while(!jakis_warunek)
{
OdrysowanieWynikowObliczen();
}
}
Wątek główny (funkcja main) zajmuje się jedynie odrysowaniem danego stanu, przy czym może to zrobić tylko po zakończeniu cyklu obliczeń przez independentx. Jeśli nie może, to czeka nie marnując zasobów. Obliczenia mogą się ciągnąć wieki lub wykonywać błyskawicznie - tak czy siak wątek, który skończy wcześniej nie może przejść do następnego etapu obliczeń, dopóki drugi też nie skończy tego samego etapu. Na wyjściu w konsoli dla powyższego przykładu chciałbym otrzymać np. coś takiego:
Thread 1: Wykonano obliczenia.
Thread 2: Wykonano obliczenia.
Odrysowano ekran!
Thread 1: Wykonano obliczenia.
Thread 2: Wykonano obliczenia.
Odrysowano ekran!
Thread 2: Wykonano obliczenia.
Thread 1: Wykonano obliczenia.
Odrysowano ekran!
Thread 1: Wykonano obliczenia.
Thread 2: Wykonano obliczenia.
Odrysowano ekran!
Próbowałem na różne sposoby stosować semafory bądź mutexy, ale zawsze kończyło się to albo deadlockiem, albo wątki się rozbiegały w obliczeniach. Może mi ktoś pomóc, jak rozmieścić te "waity i posty", żeby wszystko działało jak należy?