Podawanie metody z referencją (Bądź wskaźnikiem) do konstruktora klasy thread

0

Witam, mój problem jakiś czas temu polegał na tym że nie mogłem uzywac referencji w funkcji która trafia do konstruktora klasy thread, tak to wyglądało:

void funkcja(int &zmienna)
thread zadanie(funkcja, zmienna)

To wywalało błąd więc przerobiłem to w oto taki sposób:

void funkcja(int *zmienna)
thread zadanie(funkcja, &zmienna)

No i rzeczywiście to zadziałało:

Potem funkcja funkcja wylądowała w klasie a zmienna zadanie w innej funkcji tej samej klasy.
Błąd tym razem dotyczył tego że zmienna zadanie nie wiedziała gdzie jest funkcja funkcja.
Poczytałem trochę w internecie i znalazłem wzmiankę o tym że w takiej sytuacji trzeba przy podaniu metody do konstruktora klasy thread zadanie dać przedrostek &klasa::

ostatecznie tak to wyglądało:

void klasa::funkcja(int *zmienna)
{
//coś
}
 
void klasa::zrobZadanie()
{
int zmienna;
thread zadanie(&klasa::funkcja, &zmienna);
zadanie.join();
}
 

Jednakże znowu pojawił się błąd podany w załączniku.

Próbowałem zamienić wskaźnik w metodzie na referencje, ale błąd dalej wyskakiwał. Co robić?

Pozdrawiam, z góry dziękuję za odpowiedź.

0

Poczytaj o std::bind albo użyj lambdy. Lambda jest sztbsza, jeżeli zamierzasz to wywolywac wiele razy to lepiej użyć lambdy.

1

Zakładam,​ że klasa::funkcja nie jest funkcją statyczną, więc musi dostać niejawny wskaźnik this jako parametr.

Klasa k;
int i;
thread foo(&Klasa::funkcja, &k, &i)

Żeby przekazać referencję użyj std::ref:

thread foo(&bar, std::ref(baz));

Jeśli chodzi o przekazanie zwykłej funkcji to u mnie działa: http://melpon.org/wandbox/permlink/EneiYY04gQxVZxLH

4

Daruj sobie wielowątkowość. na razie twoje umiejętności programistyczne nie pozwalają na używanie tego wątków. Jest to bardzo trudne zagadnienie, a najgorsze jest to, że to iż coś działa nie znaczy, że jest dobrze. Wszelkie błędy w tej materii zawsze przyprawiają o frustrację.

Twój kod jest bezsensu, ale tu jest poprawka:

void klasa::zrobZadanie()
{
int zmienna;
thread zadanie(&klasa::funkcja, this, &zmienna);
zadanie.join();
}
1

Podaj aktualny kod

0

daj kod i pokaż błędy ale nie jako obrazek, ale jako tekst (copy paster z output kompilatora).

0

Ok, wszystko jednak działa, nie zorientowałem, że muszę w funkcji która trafia do konstruktora thread'a zmienić wskaźnik na referencję ;)
Wielkie dzięki za odpowiedzi :D

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