【问题标题】:Threaded base class C++线程基类 C++
【发布时间】:2015-09-12 06:52:36
【问题描述】:

我想做一些线程基类。我编写了我认为应该可以工作的代码,它可以编译并运行,但它什么也不显示。我认为,问题出在回调中,但我可能是错的。那么,我的代码有什么问题?

class ThreadedBase
{
public:
    ThreadedBase(bool start = false) : m_running(false) {
        if (start)
            this->start();
    }
    virtual ~ThreadedBase() {
        m_running = false;
        m_thread.join();
    }

    bool start(){
        if (m_running) {
            return false;
        };
        m_thread = std::thread(&ThreadedBase::run, this);
        m_running = true;
        return true;
    };

    bool stop(){
        if (!m_running) {
            return false;
        };
        m_running = false;
        return true;
    };

protected:
    virtual void threadedBlock() = 0;

    void run() {
        while (m_running) {
            threadedBlock();
        }
    }

private:
    std::thread m_thread;
    bool m_running;
};

class Test : public ThreadedBase
{
public:
    Test(bool start = true) : ThreadedBase(start) {}

    void threadedBlock() {
        std::cout << "Task\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
};

int main()
{
    Test t(true);
    t.start();

    std::this_thread::sleep_for(std::chrono::seconds(100));

    return 0;
}

【问题讨论】:

  • 当您说“不显示任何内容”时,您的意思是它不显示命令提示符(或在您运行程序的任何位置)还是仅仅意味着它不显示任何文本?
  • 不显示 (std::cout

标签: c++ multithreading c++11 pthreads


【解决方案1】:

您永远不会刷新 std::cout 流。 尝试改变:

std::cout << "Task\n";

std::cout << "Task" << std::endl;

或者在线程代码的某处调用std::cout.flush();

【讨论】:

  • 谢谢,但这不是问题 :)
  • 我认为应该/可能是个问题。它现在可以在您的平台上运行,但不能在其他平台上运行
【解决方案2】:

你需要添加:

m_running = true;

之前:

m_thread = std::thread(&ThreadedBase::run, this);

【讨论】:

  • 是的,问题出在这。但现在它因“纯虚函数调用”而崩溃
  • 尝试将“override”关键字添加到 Test::threadedBlock 的声明中,以确保您正确地覆盖了函数。
  • 你调用从基类构造函数开始,派生对象不存在。从基构造函数中删除 if (start) this->start() 并将其添加到派生类中。
  • 更准确地说,问题在于“start”使用了来自基类的构造函数的虚函数“run”。 “启动”本身没有问题,因为它不是虚拟的
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多