[C++] Watek w klasie
Ostatnio zmodyfikowano 2017-07-30 13:16
Kinexity |
» 2017-07-25 21:28:32 Mutex'em |
|
Monika90 |
» 2017-07-26 15:28:37 Można do klasy Bazowa dodać funkcję void join() { thread.join(); }
i pamiętać żeby zawsze wywołać ją zanim obiekt klasy Pochodna będzie zniszczony. Ale lepiej chyba zmienić podejście i zrezygnować z dziedziczenia implementacji. |
|
mokrowski |
» 2017-07-26 17:47:32 Do tego typu działań raczej stosuj podejście RAII. Jeśli jednak się upierasz by "niskim kosztem działało" to możesz tak jak poniżej. Ale... trzeba dbać o czas życia obiektu pochodnego i zanim zostanie zniszczony (w tym przypadku koniec main()), należy pobrać wartość przyszłości. #include <future> #include <iostream>
class Base { public: virtual std::future < void > start() final { return std::async( std::launch::async, & Base::task, this ); } virtual ~Base() { } private: virtual void task() { std::cout << "Siema!" << std::endl; } };
class Derived : public Base { private: void task() override { std::cout << "Hello!" << std::endl; } };
int main() { Derived d; auto work = d.start(); work.get(); }
|
|
jasiek1309 Temat założony przez niniejszego użytkownika |
» 2017-07-26 22:28:49 To jak to jest z tymi destruktorami? W sensie thread.join() które było w destruktorze powinno być wywołane właśnie przed zniszczeniem obiektu, a przynajmniej wydaje mi sie że powinno być :p |
|
j23 |
» 2017-07-27 10:59:01 Jak byś dał wywołanie join w destruktorze Pochodna, to problemu by nie było, bo obiekt nie zostałby zniszczony do momentu zakończenia wątku. U Ciebie, przy bardzo małym odstępie czasowym między stworzeniem a niszczeniem obiektu p, czekanie na zakończenie wątku odbywa się po zniszczeniu zawartości Pochodna i przywróceniu vtable klasy Bazowa (dlatego wątek wywołuje Bazowa::task zamiast Pochodna::task). |
|
jasiek1309 Temat założony przez niniejszego użytkownika |
» 2017-07-30 13:16:28 Dziękuje wszystkim za odpowiedzi :D |
|
1 « 2 » |