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

[C++] Watek w klasie

Ostatnio zmodyfikowano 2017-07-30 13:16
Autor Wiadomość
Kinexity
» 2017-07-25 21:28:32
Mutex'em
P-163564
Monika90
» 2017-07-26 15:28:37
Można do klasy Bazowa dodać funkcję
C/C++
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.
P-163586
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.
C/C++
#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:
   
    // Chyba lepiej tak..
    //virtual void task() = 0;
    // .. a nie "jakaś metoda" no ale to do testu...
    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(); // Tu oczywiście można np. przekazać do Derived opiekę nad futures.
}
P-163588
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
P-163594
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).
P-163599
jasiek1309
Temat założony przez niniejszego użytkownika
» 2017-07-30 13:16:28
Dziękuje wszystkim za odpowiedzi :D
P-163716
1 « 2 »
Poprzednia strona Strona 2 z 2