C++:Enkel returverdi fra std::thread?

 C Programming >> C C# Program >  >> C++
C++:Enkel returverdi fra std::thread?

Se denne videoopplæringen om C++11-futures.

Eksplisitt med tråder og 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();

Eller med std::async (omslag på høyere nivå for tråder og futures):

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

Jeg kan ikke kommentere om det fungerer på alle plattformer (det ser ut til å fungere på Linux, men bygger ikke for meg på Mac OSX med GCC 4.6.1).


Jeg vil si:

#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;
}

Legg merke til at asynkron til og med sprer eventuelle unntak som er kastet fra trådfunksjonen


Ved å bruke C++11-tråder kan man ikke få returverdien som trådutgang, noe som tidligere var tilfellet med pthread_exit(...)

Du må bruke C++11 Future<> for å få returverdien. Future er opprettet ved hjelp av malt argument der malen tar returverdien (innebygd av brukerdefinerte typer).

Du kan hente verdien i en annen tråd ved å bruke future<..>::get(..) funksjon.

én fordel ved å bruke future<..> er at du kan sjekke gyldigheten av returverdien, dvs. at hvis den allerede er tatt, unngår du å ringe get() ved et uhell ved å sjekke gyldigheten med future<..>::isValid(...) funksjon.

Slik skriver du koden.

#include <iostream>
#include <future>
using namespace std;
auto retFn() {
    return 100;
}
int main() {
    future<int> fp = async(launch::async, retFn);
    if(fp.valid())
       cout<<"Return value from async thread is => "<<fp.get()<<endl;
    return 0;
}

det bør også bemerkes at vi kan få fremtiden kjørt på samme tråd ved å bruke launch::deferred alternativ som

 future<int> fp = async(launch::deferred, retFn);