未调用函数会影响代码结果

时间:2019-07-18 16:59:12

标签: c++

在这里挠头。在下面的代码中,函数f通过task_lambda()task_bind()task_thread()以3种不同的方式使用。但是,在main()中,只有函数task_lambda()task_bind()被实际调用和执行。但是,如果您敢于取消注释#if 0代码块,以使未使用的功能task_thread()不再存在于代码中,则main中的代码现在将引发异常(-1)system_error。

代码如下:

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

这到底是什么意思?

编辑-添加工具链信息:

Ubuntu 16.04-Linux 4.4.0-154-通用

gcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1〜16.04.11)

1 个答案:

答案 0 :(得分:0)

正在使用不正确的链接器标志-lpthreads而不是-pthreads编译代码。

使用-pthreads标志后,现在无论有没有使用未使用的函数,代码都可以正常工作。

仍然不确定在没有使用未使用的代码的情况下如何导致代码无法工作。