std::promise i std::future różne zachowanie się programu
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

std::promise i std::future różne zachowanie się programu

AutorWiadomość
Temat założony przez niniejszego użytkownika
std::promise i std::future różne zachowanie się programu
» 2018-06-09 21:40:32
Cześć,
czasami próbuję napisać niezbyt poprawny kod, żeby zobaczyć jaki będzie efekt, czy się skompiluje, czy może wyrzuci runtime error.
Mam tutaj kod, który dziwnie działa. Domyślałbym się, że zawsze powinien wychodzi z pętli i pierwsze co wypisywać w oknie konsoli to: "before set". Tak się jednak nie dzieje. Co dziwniejsze czasami się dochodzi do końca programu, a czasami nie. U mnie kończy mniej więcej raz na pięć. Nie wiem jaka jest zależność. Czasami próbuję odkomentować jakąś linijkę z coutem, czasem zakomentuję.
Dlaczego "before set" nie wyświetla się jako pierwsze? Jak pętla będzie od i < 1 (raz się wykona), to właśnie "before set" się wyświetla najpierw.

C/C++
#include <iostream>
#include <thread>
#include <string>
#include <future>

using std::cout;
using std::endl;
using namespace std::chrono_literals;

int fun( std::future < int > & sf )
{
    //cout << "before sleep" << endl;
    std::this_thread::sleep_for( 1000ms );
    cout << "before get" << endl;
    auto x = sf.get();
    cout << "after get " << x << endl;
    return x * x;
}

int main()
{
    std::promise < int > prom;
    std::future < int > futu = prom.get_future();
    std::future < int > futu2;
    for( int i = 0; i < 2; ++i )
    {
        futu2 = std::async( std::launch::async, fun, std::ref( futu ) );
        //cout << "main" << endl;
    }
   
    cout << "before set" << endl;
    prom.set_value( 9 );
    cout << "after set" << endl;
   
    futu2.wait();
    cout << "after wait " << futu2.get() << endl;
   
   
    return 0;
}
P-171457
» 2018-06-10 10:45:50
Dwie sprawy:
1. Przypisujesz dwa razy wartość z async do futu2. Jeśli się nie mylę, przy drugim przypisaniu, dojdzie do zablokowania wątku do czasu zakończenia pierwszego zadania. Dojdzie do zakleszczenia wątków.
2. futu powinno być std::shared_future.
P-171458
« 1 »
 Strona 1 z 1