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

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

Ostatnio zmodyfikowano 2018-06-10 10:45
Autor Wiadomość
robaczek122
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
j23
» 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