多线程代码不能使用g ++进行编译,但对于clang ++

时间:2015-07-02 12:36:12

标签: c++ multithreading c++11 g++ clang++

我遇到了g ++编译器的问题。在我的工作机器上(运行OS X 10.10.4)我正在使用Xcode试验一些代码。代码确实成功编译,生成的可执行文件按预期工作。输出clang++ --version

  

Apple LLVM版本6.1.0(clang-602.0.53)(基于   LLVM 3.6.0svn)目标:x86_64-apple-darwin14.4.0线程模型:posix

然后我决定在使用g ++运行Debian 8的服务器上编译此代码。 g++ --version的输出:

  

g ++(Debian 4.9.2-22)4.9.2版权所有(C)2014自由软件   Foundation,Inc。

代码甚至不会使用g ++进行编译。我尝试使用的命令:g++ -std=c++11 -pthread main.cpp

我收到以下错误消息:

  

main.cpp:在函数'int main()'中:

     

main.cpp:32:106:错误:无效使用不完整类型'class std :: packaged_task'        std :: shared_ptr> ptr(new std :: packaged_task(std :: bind(factorial,6)));

     

main.cpp中包含的文件:11:0:

     

/ usr / include / c ++ / 4.9 / future:120:11:错误:'class std :: packaged_task'的声明        class packaged_task;              ^

     

main.cpp:33:22:错误:变量'std :: future fu1'有初始值但不完整的类型        std :: future fu1 = ptr-> get_future();                         ^

     

main.cpp:33:31:错误:无效使用不完整类型'class std :: packaged_task'        std :: future fu1 = ptr-> get_future();                                  ^

     

main.cpp中包含的文件:11:0:

     

/ usr / include / c ++ / 4.9 / future:120:11:错误:'class std :: packaged_task'的声明        class packaged_task;              ^

     

main.cpp:在lambda函数中:

     

main.cpp:34:48:错误:无效使用不完整类型'class std :: packaged_task'        std :: function task1 =& ptr {ptr-> operator()(); };                                                   ^

     

main.cpp中包含的文件:11:0:

     

/ usr / include / c ++ / 4.9 / future:120:11:错误:'class std :: packaged_task'的声明        class packaged_task;              ^

     

main.cpp:在函数'int main()'中:

     

main.cpp:36:38:错误:变量'std :: packaged_task t'有初始化程序但是类型不完整        std :: packaged_task t(std :: bind(factorial,5));                                         ^

     

main.cpp:37:22:错误:变量'std :: future fu2'有初始值但不完整的类型        std :: future fu2 = t.get_future();                         ^

我的代码:

#include <iostream>
#include <thread>
#include <future>
#include <memory>

using std::cout;
using std::cin;
using std::endl;

unsigned long long int factorial(unsigned long long int num)
{
    unsigned long long int N = num;
    for (unsigned long long int i = num; i > 1; --i)
    {
        num *=(--N);
    }

    return num;
}

int main()
{

    std::shared_ptr<std::packaged_task<int()> > ptr(new std::packaged_task<int()>(std::bind(factorial, 6)));
    std::future<int> fu1 = ptr->get_future();
    std::function<void()> task1 = [&ptr](){ ptr->operator()(); };

    std::packaged_task<int()> t(std::bind(factorial, 5));
    std::future<int> fu2 = t.get_future();
    std::function<void()> task2 = [&t](){ t(); };

    std::thread threads[2];

    threads[0] = std::thread(task1);
    threads[1] = std::thread(task2);

    cout << fu1.get() << endl;
    cout << fu2.get() << endl;

    threads[0].join();
    threads[1].join();

    return 0;
}

g ++会出现什么问题?

1 个答案:

答案 0 :(得分:1)

看来std::future&amp;由于某种原因,armel架构上没有实现std::async

我无法真正找到原因(有些人认为邮件列表,他们没有通过设计实现,有些人说这是一个错误)以及问题的当前状态是什么。

但是,我还发现一条回复说明可能已在libstdc++的较新版本中得到解决(我的系统正在运行debian的测试版,我不知道有这些版本,我不打算从不稳定的回购中获取包,所以我只是等待它。)