Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: GoldWolf
Inne artykuły

Co to jest programowanie współbieżne?

[artykuł] Artykuł odpowiada na pytanie co to jest programowanie współbieżne oraz pokazuje najprostszy przykład jego wykorzystania.
Wielowątkowość jest dość trudno opisać, szczególnie w sytuacji gdy nie jest to jeszcze powszechnie używania technika programowania. C++ w swoich standardach nie posiada wielowątkowości, ponieważ wielowątkowość jest cechą systemu operacyjnego, a nie specjalną funkcją języka C++.

Od kilkunastu miesięcy większość z nas posiada już procesory, które posiadają dwa rdzenie(dwa osobne procesory). Procesory tego typu potrafią obsługiwać w jednym cyklu zegara dwa osobne wątki. Więc co stoi na przeszkodzie by napisać aplikację(program), który będzie korzystać z tego dobrodziejstwa, właściwie tylko My sami.
 
Systemy operacyjne(wielowątkowe), które potrafią obsługiwać wielowątkowość to m.in. BeOS, Microsoft Windows 95, Windows NT, Unix, Linux. Jak widać od początku istnienia systemów okienkowych(i nie tylko) mogliśmy używać tego rozwiązania.

Największą zaletą jest możliwość stworzenia aplikacji, która w tym samym czasie będzie robiła kilka rzeczy jednocześnie(współbieżnie), a wartością ograniczającą jest liczba rdzeni procesora. Ktoś powie chwileczkę, ale przecież już teraz Mój procesor potrafi wykonywać kilka czynności na raz! Niestety nie, procesory są na tyle szybkie, iż nam się wydaję, że robią kilka rzeczy na raz. Faktycznie jednak, każdy proces jest wykonywany oddzielnie(po kolei).

Innymi cechami wielowątkowości są:
  • wątki mają dostęp do tych samych zmiennych, obiektów, struktur,
  • łatwiejsza komunikacja między wątkami(niż samymi programami),
  • wspólna przestrzeń adresowa(wirtualna),
  • systemy wielowątkowe posiadają mechanizmy które zapewniają synchronizacje wątków.
Ostatni poruszony aspekt, czyli synchronizacja wątków, jest bardzo ważny. Gdyż może się okazać, iż napisany program ma mniejszą wydajność lub nie nadaje się do używania.

Przykład aplikacji wielowątkowej

C/C++
// aplikacja wielowątkowa Dev C++--------------
#include <iostream>
#include <process.h>
#include <time.h>
using namespace std;

//pierwszy wątek ------------------
void myFunction( void * dummy ) {
   
    cout << "wątek nr 1 \n";
    _endthread(); // zakończenie wątku
}
//drugi wątek ------------------
void myFunction1( void * dummy ) {
   
    cout << "wątek nr 2\n";
    _endthread(); // zakończenie wątku
   
}
//trzeci wątek ------------------
void myFunction2( void * dummy ) {
    system( "taskmgr" );
    _endthread(); // zakończenie wątku
}
//czwarty wątek ------------------
void myFunction3( void * dummy ) {
    //    int sekudny = 240;
    clock_t koniec_czekania;
    koniec_czekania = clock() + 120 * CLOCKS_PER_SEC;
    while( clock() < koniec_czekania ) { }
   
    _endthread(); // zakończenie wątku
}
int main()
{
    int liczba;
   
    cout << "Podaj ile masz procesorow(liczbe rdzeni) w systemie: ";
    cin >> liczba;
    if( liczba > 0 && liczba < 5 ) {
        if( liczba == 1 ) {
            //uruchomienie wątku
            _beginthread( myFunction, 0, 0 );
            _beginthread( myFunction1, 0, 0 );
            _beginthread( myFunction2, 0, 0 );
        }
        if( liczba == 2 ) {
            //uruchomienie wątku
            _beginthread( myFunction, 0, 0 );
            _beginthread( myFunction1, 0, 0 );
            _beginthread( myFunction2, 0, 0 );
            // I wątek dla obciążenia procesora
            _beginthread( myFunction3, 0, 0 );
            // II wątek dla obciążenia procesora
            _beginthread( myFunction3, 0, 0 );
        }
        if( liczba == 3 ) {
            _beginthread( myFunction, 0, 0 );
            _beginthread( myFunction1, 0, 0 );
            _beginthread( myFunction2, 0, 0 );
            // I wątek dla obciążenia procesora
            _beginthread( myFunction3, 0, 0 );
            // II wątek dla obciążenia procesora
            _beginthread( myFunction3, 0, 0 );
            // III wątek dla obciążenia procesora
            _beginthread( myFunction3, 0, 0 );
        }
        if( liczba == 4 ) {
            _beginthread( myFunction, 0, 0 );
            _beginthread( myFunction1, 0, 0 );
            _beginthread( myFunction2, 0, 0 );
            // I wątek dla obciążenia procesora
            _beginthread( myFunction3, 0, 0 );
            // II wątek dla obciążenia procesora
            _beginthread( myFunction3, 0, 0 );
            // III wątek dla obciążenia procesora
            _beginthread( myFunction3, 0, 0 );
            // IV wątek dla obciążenia procesora
            _beginthread( myFunction3, 0, 0 );
        }
    } else cout << "Podano bledna liczbe" << endl;
   
    system( "PAUSE" );
    return 0;
}

Do sprawdzenia działania użyto pętli, która będzie się wykonywać przez 2 min. By sprawdzić czy rzeczywiście obsługiwana jest wielowątkowość uruchomiony jest Menadżer zadań Windows. Wystarczy przejść na zakładkę wydajność by zobaczyć(w przypadku procesorów wielordzeniowych), iż każdy z procesorów jest obciążany co potwierdza skuteczność działania programu.

W programie tym nie użyto synchronizacji wątków, gdyż nie istniała taka potrzeba, piszę o tym, gdyż może się tak zdarzyć, iż zaczniesz programować i napotkasz problemy przy adaptacji rozwiązań wielowątkowych do swych zastosowań(programów).

Jeżeli posiadasz jeden rdzeń to także możesz przetestować działanie dla 2 i więcej rdzeni. Dzieje się tak dlatego, iż system operacyjny sobie z tym poradzi bez kłopotów. Jedynie wydajność programu i samego systemu może być znacznie gorsza(zależna od możliwości procesora). Program obsługuje max 4 rdzenie.


Zachęcam do pisania aplikacji wielowątkowych(szczególnie dwu), jednak należy pamiętać o tym, iż nie zawsze daje to duża różnice wydajności, a czasami może przysporzyć więcej kłopotów i zmartwień(synchronizacja wątków).

Pozostałe informacje

Artykuł ten powstał tylko po to by Wam uzmysłowić jakie to jest proste, a nie po to by wyczerpać całkowicie zagadnienie i problemy z nim związane.

Przy tworzeniu artykułu korzystałem z Wikipedia i Kodu źródłowego, zaglądnijcie jeśli chcecie poszerzyć wiedzę.