使用C++11线程与纯虚线程函数

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

1
可能是和这个问题一样:https://dev59.com/cmw15IYBdhLWcg3wo9Rx 尝试在g++命令行中添加-pthread。 - Cyrille Ka
1
@ckarmann,你是对的。确实有std::system_error被抛出,但它没有在Code::Blocks终端上显示。当我从一个适当的终端运行它时,它就在那里了。如果你想得到积分,请添加一个答案! - James
不,你用一个包含错误的代码片段替换了一个完全有效的代码片段。(没有调用join函数) - Stephan Dollberg
不可以,因为这会改变问题的意图。你的新代码片段无法编译,因为它有语法错误。 - Stephan Dollberg
2
@bamboon 你说得对。已经修复了。你知道,这个网站的整个目的就是协作和知识共享。一旦你发现问题,你也可以修复它。 - James
显示剩余9条评论
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接