首页 > 解决方案 > 如何制作一个永远运行的线程?

问题描述

我有一个任务,我应该在不使用任何 CPU 或操作系统时钟功能的情况下测量数据包之间的一些延迟(这可能听起来很愚蠢,但在我必须制作的虚拟网络中是有意义的)并且决定编写我自己的时钟类,类似于我们使用我们知道其频率的内部振荡器使用微控制器测量时间的方式。

我开始编写一个Clock小类,我将创建一个类的私有成员,TCP以简单地扮演一个内部时钟的角色,size_t period每毫秒滴答一次。没有什么花哨的,时间测量的准确性并不重要。

#include <iostream>
#include <cstdio>
#include <thread>

class Clock{
  public:
    Clock();
    ~Clock();
    Clock(const size_t& period);

    size_t getElapsedTime();

    void run();
  private:
    size_t period;
    size_t elapsedTime;
    bool running;
  protected:

};

Clock::Clock() :period(1000000), elapsedTime(0), running(true)
{
    std::thread t(run);
    t.detach();
}

Clock::Clock(const size_t& period) : elapsedTime(0), running(true) {
    this->period = period;
}

void Clock::run() {
    while (this->running){
        for ( int i = 0; i < period; ++i){;}

        ++elapsedTime;
    }
}

Clock::~Clock(){
}

std::size_t Clock::getElapsedTime() {
    return elapsedTime;
}

int main(){

    Clock clk(1000000);

    return 0;
}

我遇到的问题是我似乎无法让这个线程工作。我想让它不停地运行,直到我破坏Clock对象并且当大程序中的某个事件发生时,我想调用getElapsedTime()并查看触发该事件需要多长时间。

写作时std::thread t(run);我得到一个错误说error: invalid use of non-static member function 'void Clock::run()' ,但使该方法static产生更多错误。

标签: c++multithreading

解决方案


您也需要将 传递Clock给线程。

std::thread t(&Clock::run, this);

推荐阅读