【问题标题】:How do I make a thread that runs forever?如何制作一个永远运行的线程?
【发布时间】:2021-01-08 11:19:55
【问题描述】:

我有一个任务,我应该在不使用任何 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 方法会产生更多错误。

【问题讨论】:

  • for(;;) { /* Do stuff */ } 也许??
  • 您需要查看构建系统的文档才能以标准兼容模式调用它。 iirc gcc 可以在创建程序的模式下运行,无需线程
  • ...或者最好是-pthread
  • 如果你想让线程一直运行直到你销毁你的Clock,那么为什么不让它成为一个成员呢?清理附加线程要困难得多。
  • 还有一点不安全:线程的生命周期可能比启动它的 Clock-object 的生命周期长,sou 可能会得到一个悬空指针和未定义的行为。

标签: c++ multithreading


【解决方案1】:

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

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

【讨论】:

  • 在 gcc 10.2 上仍然给我一个错误,更准确地说是undefined reference to pthread_create' `
  • @beginner420 这是demo
  • 考虑将此作为答案发布,以便我将其标记为解决方案。
  • @beginner420 我在路上,现在无法写出正确的答案。我不介意 Caleth 是否将详细信息或演示链接添加到此答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2021-10-10
  • 2013-08-25
  • 2013-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多