8

我有代码,其中打算在单独的线程中执行的对象从具有纯虚Run函数的基类派生。我无法获得以下(简化的测试代码)来运行新线程。

#include <iostream>
#include <thread>
#include <functional>

class Base {
public:
    virtual void Run() = 0;
    void operator()() { Run(); }
};

class Derived : public Base {
public:
    void Run() { std::cout << "Hello" << std::endl; }
};

void ThreadTest(Base& aBase) {
    std::thread t(std::ref(aBase));
    t.join();
}

int main(/*blah*/) {
    Base* b = new Derived();
    ThreadTest(*b);
}

代码编译得很好(这是成功的一半),但“Hello”永远不会被打印出来。如果我做错了什么,我预计会在某个时候出现运行时错误。我正在使用 gcc。

编辑:上面的代码无法在 VS2012 上编译,其中: error C2064: term does not evaluate to a function taking 0 arguments

您需要使用 lambda 而不是std::ref,即

void ThreadTest(Base& aBase)
{
    std::thread t([&] ()
    {
        aBase.Run();
    });
    t.join();
}
4

1 回答 1

3

您需要将 -pthread 添加到 g++ 命令行,如对类似问题的回答中所述:https ://stackoverflow.com/a/6485728/39622 。

于 2013-01-30T18:07:48.377 回答