Je me gratte la tête. Dans le code ci-dessous, la fonction f
est utilisé de 3 manières différentes via task_lambda()
, task_bind()
y task_thread()
. En main()
Toutefois, seules les fonctions task_lambda()
y task_bind()
sont effectivement appelées et exécutées. CEPENDANT, si vous osez décommenter l'élément #if 0
bloc de code de telle sorte que la fonction non utilisée task_thread()
n'est plus dans le code, alors le code dans main lancera une exception (-1) system_error.
Voici le code :
#include <iostream>
#include <cmath>
#include <thread>
#include <future>
#include <functional>
#include <unistd.h>
// unique function to avoid disambiguating the std::pow overload set
int f(int x, int y) { return std::pow(x,y); }
void task_lambda()
{
std::packaged_task<int(int,int)> task([](int a, int b) {
return std::pow(a, b);
});
std::future<int> result = task.get_future();
task(2, 9);
std::cout << "task_lambda:\t" << result.get() << '\n';
}
void task_bind()
{
std::packaged_task<int()> task(std::bind(f, 2, 11));
std::future<int> result = task.get_future();
task();
std::cout << "task_bind:\t" << result.get() << '\n';
}
//#if 0
void task_thread()
{
std::packaged_task<int(int,int)> task(f);
std::future<int> result = task.get_future();
std::thread task_td(std::move(task), 2, 10);
task_td.detach();
}
//#endif
int main()
{
task_lambda();
task_bind();
sleep(1);
}
Qu'est-ce que cela signifie ?
EDIT - ajout de l'information sur la chaîne d'outils :
Ubuntu 16.04 - Linux 4.4.0-154-generic
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.11)