52 votes

C++ : valeur de retour simple de std::thread ?

Avec les threads win32, j'ai le simple GetExitCodeThread() qui me donne la valeur renvoyée par la fonction de thread. Je recherche quelque chose de similaire pour std::thread (ou booster les threads) Si je comprends bien, cela peut être fait avec des contrats à terme, mais comment exactement ?

84voto

Alex B Points 34304

Voir ce didacticiel vidéo sur les futurs C++11.

Explicitement avec les threads et les futures :

 #include <thread>
#include <future>

void func(std::promise<int> && p) {
    p.set_value(1);
}

std::promise<int> p;
auto f = p.get_future();
std::thread t(&func, std::move(p));
t.join();
int i = f.get();

Ou avec std::async (encapsuleur de niveau supérieur pour les threads et les futures) :

 #include <thread>
#include <future>
int func() { return 1; }
std::future<int> ret = std::async(&func);
int i = ret.get();

Je ne peux pas dire si cela fonctionne sur toutes les plates-formes (il semble fonctionner sur Linux, mais ne fonctionne pas pour moi sur Mac OSX avec GCC 4.6.1).

43voto

sehe Points 123151

Je dirais:

 #include <thread>
#include <future>

int simplefunc(std::string a)
{ 
    return a.size();
}

int main()
{
      auto future = std::async(simplefunc, "hello world");
      int simple = future.get();

      return simple;
}

Notez qu'async propage même toutes les exceptions levées à partir de la fonction de thread

3voto

Martin Points 481

Je pense qu'une variable de référence se lit beaucoup plus intuitivement.

 std::mutex m;

void threadFunction(int& val) {
    std::lock_guard<std::mutex> guard(m);
    val = 5;
}

int x = 0;
std::thread theThread(threadFunction, std::ref(x));
theThread.join();
std::cout << x << std::endl;
// prints 5

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X