C++, wielowątkowość - skrzyżowanie

0

Cześć, robię symulację skrzyżowania dwóch dróg równorzędnych. Chcę, aby było, np. 8 pojazdów i każdy był obsługiwany w innym wątku. Zrobiłem klasę pojazd, umiem zrobić wywołanie funkcji w nowym wątku

CreateThread(NULL, 0, Watek, (PVOID)Tworz(i), 0, &IdWatku);

Niestety nie wiem, jak zrobić, aby tworzyły się wątki na stałe i były przypisane do danych obiektów klasy i później wywołując jakąś funkcję na korzyść danego obiektu była ona obsługiwana w przypisanym do niego wątku...

1

z MSDN:

HANDLE WINAPI CreateThread(
In_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
In SIZE_T dwStackSize,
In LPTHREAD_START_ROUTINE lpStartAddress,
In_opt LPVOID lpParameter,
In DWORD dwCreationFlags,
Out_opt LPDWORD lpThreadId
);

zakładając, że masz klasę np.:

class Pojazd
{
public:
  void Odpal()
  {
    odpalony = true;
    CreateThread(NULL, 0, Watek, (void*)this, 0, &idWatku);
  }
  void Zgas()
  {
    odpalony = false;
  }
  // jakies inne operacje
private:
  volatile bool odpalony;
  DWORD idWatku;
  static DWORD WINAPI Watek(void* p)
  {
    Pojazd& p = *((Pojazd*)p); // na tym obiekcie operujesz w watku
    while (p.odpalony)
    {
      // tutaj cos rob
      Sleep(1); // tutaj odczekaj chwile po kazdej operacj
    }
  }
};

Pojazdy odpalasz tak:

Pojazd pojazdy[8]; // musisz zadbac o to zeby te obiekty istnialy dopoki wszystkie watki sie nie zakoncza
for (int i =0; i < 8; i++)
  {
    pojazdy[i].Odpal();
  }

pisane z palca mogą być błędy.

zamiast dbania o obiekty możesz wykorzystać również np. taki szablon:

class Pojazd
{
//... (to samo co wczesniej)
  static DWORD WINAPI Watek(void* p)
  {
    Pojazd& p = *((Pojazd*)p); // na tym obiekcie operujesz w watku
    while (p.odpalony)
    {
      // tutaj cos rob
      Sleep(1); // tutaj odczekaj chwile po kazdej operacj
    }
   delete this;
  }
};

i odpalasz watki tak:

Pojazd* pojazdy[8]; // musisz zadbac o to zeby te obiekty istnialy dopoki wszystkie watki sie nie zakoncza
for (int i =0; i < 8; i++)
  {
    pojazdy[i] = new Pojazd();
    pojazdy[i]->Odpal();
  }

na końcu programu czekasz aż wszystkie wątki się zakończą, ale nie zwalniasz pamięci, bo wątek o to dba. Osobiście wolę opcję ze stosem.

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