如何制作一个永远运行的线程?

Posted

技术标签:

【中文标题】如何制作一个永远运行的线程?【英文标题】: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 可能会得到一个悬空指针和未定义的行为。 【参考方案1】:

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

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

【讨论】:

在 gcc 10.2 上仍然给我一个错误,更准确地说是undefined reference to pthread_create' ` @beginner420 这是demo 考虑将此作为答案发布,以便我将其标记为解决方案。 @beginner420 我在路上,现在无法写出正确的答案。我不介意 Caleth 是否将详细信息或演示链接添加到此答案。

以上是关于如何制作一个永远运行的线程?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何让 Java 应用程序永远运行 [关闭]

Adobe flash (AS2):如何制作一个永远重复的循环,并且每 5 秒复制一个影片剪辑?

如何找到并停止所有当前正在运行的线程?

一个多线程的python程序永远不会退出

QNetworkAccessManager 线程永远不会完成

如何使 Java 桌面应用程序永远不会让系统休眠并在后台运行?