首页 文章

多线程代码不会使用g进行编译,但是对于clang来说很好

提问于
浏览
1

我在使用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

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

g(Debian 4.9.2-22)4.9.2版权所有(C)2014 Free Software 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'类的声明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'类的声明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'类的声明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 回答

  • 1

    似乎 std::futurestd::async 由于某种原因未在armel架构上实现 .

    我真的不知道为什么会这样(有些人在邮件列表上争论说,他们没有通过设计实现,有些人说这是一个错误)以及问题的当前状态是什么 .

    但是,我也发现了一个回复,声明 may 已经在 libstdc++ 的新版本中得到了解决(我的系统正在运行debian的测试版,我还没有这些版本,而且我只是等待它了't plan to get the package from unstable repos, so I' ll ) .

相关问题