Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wiele wątków jednocześnie

Ostatnio zmodyfikowano 2014-03-21 19:56
Autor Wiadomość
matiko101
Temat założony przez niniejszego użytkownika
Wiele wątków jednocześnie
» 2014-03-21 15:29:02
Witam,

Pierwszy raz używam wątków i mam problem.

Chce zrobić coś jak skrzyżowanie i chce aby każdy samochód był wątkiem.

Mam następujące pytania:

1. Czy kilka wątków może w tym samym czasie korzystać z jednej metody/funkcji ?
2. Jak wygląda tworzenie zmiennych ? Jedna stworzona w danej funkcji stworzy się tylko raz i będzie wspólna dla wszystkich wątków ?
3. Jeśli jest wspólna to jak to zrobić, by każdy wątek w jednej funkcji tworzył zmienne widoczne tylko dla siebie ?
tzn. :

wątek1 -> funkcja -> zmienne miejsca i prędkości -> poruszanie się
wątek2 -> funkcja -> zmienne miejsca i prędkości -> poruszanie się   (chciałbym , aby te zmienne miały inne własne wartości)   

4. Ma to wyglądać tak, że :

tworzy się wątek -> w wątku tworzy się samochód -> w wątku pętla nieskończona ruchu samochodu
tworzy się wątek2 -> w wątku tworzy się samochód2 -> w wątku pętla nieskończona ruchu samochodu2

5. Jak zainicjować zmienne, by każda ze zmiennych była używana tylko w jednym wątku,a w drugim inna zmienna o tych samych właściwościach.

Dam kawałek kodu:

main.cpp
C/C++
Samochod samochod;
samochod.tworzenie( samochod );
pthread_create( & samochod.watek[ 0 ], NULL, & p_dodawanie,( void * ) & samochod );
dodawanie.cpp
C/C++
void Samochod::dodawanie( Samochod & samochod )
{
    pthread_create( & samochod.watek[ 1 ], NULL, & p_poruszanie,( void * ) & samochod );
    pthread_create( & samochod.watek[ 2 ], NULL, & p_poruszanie,( void * ) & samochod );
}
poruszanie.cpp
C/C++
void poruszanie( Samochod & samochod )
{
    double x, y;
    x = 100;
    y = 50;
    cout << "Nowy watek" << endl;
    cout << x << endl;
    cout << y << endl;
    if( getpixel( samochod.bufor, x + 40, y ) != makecol( 255, 127, 39 ) )
    {
        while( x < 500 )
        {
            x += 0.1;
            y += 0.1;
            cout << x << endl;
           
            masked_blit( samochod.car, samochod.bufor, 0, 0, x, y, samochod.car->w, samochod.car->h );
            blit( samochod.bufor, screen, 0, 0, 0, 0, 800, 600 );
        }
    }
   
}
P-106910
Monika90
» 2014-03-21 15:57:07
Wątki nie są dla dzieci.

Każdy wątek ma swój własny stos, więc ma własne zmienne automatyczne (czyli lokalne tworzone na stosie) i może ich sobie używać do woli (no chyba, że przekaże adres takiej zmiennej innemu wątkowi).

Natomiast użycie tego samego obiektu przez różne watki wymaga synchronizacji jeżeli co najmniej jeden z wątków modyfikuje obiekt. U ciebie takimi obiektami są cout i screen (i byc może inne). Standard C++11 gwarantuje, że można używać cout jednocześnie w wielu wątkach bez stosowania zewnętrznej synchronizacji, ale nie wiadomo czy implementacja standardowej biblioteki, której używasz jest zgodna ze standardem.

W przypadku screen musisz sobie przeczytać w dokumentacji biblioteki, czy można wywoływać blit jednocześnie z wielu wątków, jeżeli nie można, to musisz użyć muteksa.
P-106917
DejaVu
» 2014-03-21 19:56:08
Dodam jeszcze, że Twój 'wielowątkowy' pomysł będzie znacznie gorzej działał niż jednowątkowa aplikacja.
P-106948
« 1 »
  Strona 1 z 1