【发布时间】: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