多线程代码不能使用 g++ 编译,但可以使用 clang++

Multithreaded code won't compile using g++, but is fine with clang++

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

Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) Target: x86_64-apple-darwin14.4.0 Thread model: posix

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

g++ (Debian 4.9.2-22) 4.9.2 Copyright (C) 2014 Free Software Foundation, Inc.

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

我收到以下错误消息:

main.cpp: In function 'int main()':

main.cpp:32:106: error: invalid use of incomplete type 'class std::packaged_task' std::shared_ptr > ptr(new std::packaged_task(std::bind(factorial, 6)));

In file included from main.cpp:11:0:

/usr/include/c++/4.9/future:120:11: error: declaration of 'class std::packaged_task' class packaged_task; ^

main.cpp:33:22: error: variable 'std::future fu1' has initializer but incomplete type std::future fu1 = ptr->get_future(); ^

main.cpp:33:31: error: invalid use of incomplete type 'class std::packaged_task' std::future fu1 = ptr->get_future(); ^

In file included from main.cpp:11:0:

/usr/include/c++/4.9/future:120:11: error: declaration of 'class std::packaged_task' class packaged_task; ^

main.cpp: In lambda function:

main.cpp:34:48: error: invalid use of incomplete type 'class std::packaged_task' std::function task1 = &ptr{ ptr->operator()(); }; ^

In file included from main.cpp:11:0:

/usr/include/c++/4.9/future:120:11: error: declaration of 'class std::packaged_task' class packaged_task; ^

main.cpp: In function 'int main()':

main.cpp:36:38: error: variable 'std::packaged_task t' has initializer but incomplete type std::packaged_task t(std::bind(factorial, 5)); ^

main.cpp:37:22: error: variable 'std::future fu2' has initializer but incomplete type 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++ 可能有什么问题?

由于某些原因,std::future & std::async 似乎没有在 armel 架构上实现。

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

不过,我也找到了一个回复,说这个可能已经在较新版本的libstdc++中解决了(我的系统是运行 debian的测试版本,我还没有这些版本,我也不打算从不稳定的repos中获取包,所以我会等待它)。