6 votes

La fonction non appelée a un effet sur le résultat du code

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)

0voto

Haroldo Points 61

Le code était compilé avec le drapeau incorrect de l'éditeur de liens -lpthreads au lieu de -pthreads.

Une fois que l'option -pthreads a été utilisée, le code se comporte maintenant avec ou sans la fonction inutilisée.

Je ne comprends toujours pas comment le code pourrait ne pas fonctionner sans ce code inutilisé.

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