C++ 中线程和锁的低精度微秒定时器回调

问题描述 投票:0回答:1

我编写了一个运行速度不够快的

timercallback
类:

class Manager
{
    ...
    void CallFunction(Function<Treturn>* m_function)
    {
        do
        {
            if (m_Status == TimerStatus::Paused)
            {
                unique_lock<mutex> lock(m_MutexLock);
                m_Notifier.wait(lock);
            }
            while (m_Status != TimerStatus::Stoped&&m_Status != TimerStatus::Paused)
            {
                unique_lock<mutex> lock(m_MutexLock);
                m_Notifier.wait_for(lock, m_Interval);

                (*m_function)();
            }

        } while (m_Status == TimerStatus::Paused);
    }
    ...
}

当我设置timercallback的时间为每1ms调用一次该函数时,它不起作用。需要更多时间,例如 10 毫秒。我需要帮助改进代码,以 1 毫秒的间隔调用回调函数(此计时器的事件函数),并在一个带锁的线程中运行。我该怎么做?

该类的使用示例:

Manager tester;
TimerCallback<microseconds> m_timer(chrono::microseconds(10), Core::Utility::ptr_fun(&tester, &Manager::runner));
c++ multithreading callback condition-variable time-precision
1个回答
0
投票

您正在尝试使用

wait_for()
函数作为计时器,这确实不是拥有高精度计时器的好方法。不过,如果您需要互斥量功能,那么这几乎就是您所能得到的。

如果您使用互斥锁来获取信号,那么也许您可以改用

ppoll()
。该函数也可以在没有任何事件的情况下使用,只需一个超时,然后它就可以用作计时器。

另一种解决方案是简单地使用

nanosleep()
函数。这比
ppoll()
调用简单得多,因为您只需要一个
timespec
结构:

struct timespec t = { .tv_sec = 0, .tv_nsec = 1'000'000 };
nanosleep(&t);

旁注:

根据我使用 VirtualBox 的经验,虚拟机时钟精度非常糟糕。换句话说,在这样的系统上,您不太可能在调用之间获得可靠的 1 毫秒睡眠。我不知道这是否适用于基于云的虚拟机(它可能使用比 VirtualBox 更好的解决方案,但计时器的情况可能类似)。

© www.soinside.com 2019 - 2024. All rights reserved.