线程如何更改睡眠时间

时间:2018-08-26 16:37:33

标签: c++ multithreading c++11

在我的项目中,我具有以下定义的功能:

void start(std::chrono::milliseconds delay) override
{
    mDelay = delay;
    if(mThread == nullptr)
    {
        mThread = std::make_unique<Thread>([&]()
        {
            sleep(std::chrono::milliseconds(mDelay));
        });
    }
}

当我第一次调用该方法时,将创建线程并在mDelay周期内进入睡眠状态。但是我需要再次更改mDelay时间,但是更改的时间要比提供的更早。

但是当我再次调用它时,我无法取消先前的睡眠并使用定义的mDelay开始新的睡眠吗?

我怎么能达到同样的目的?

3 个答案:

答案 0 :(得分:2)

我明白了您要做什么,我相信std::condition_variable是您要寻找的东西。

您可以致电wait_for而不是睡觉。当您想唤醒线程时,可以调用notify_one

答案 1 :(得分:1)

第一次创建线程后,mThread永远不会在线程完成其工作后重置。下次调用start()时,mThread不再是nullptr,因此不会使用更新的delay创建新线程。

要么Thread lambda需要在退出前将mThread重置为nullptr,否则Thread需要一个bool成员,lambda可以在退出前设置。两种方法都可以让start()知道何时需要新线程。

答案 2 :(得分:0)

移动并处置旧线程(来自移动设备,未经测试的代码)。如果该线程要触发处理程序,则只需引发一个killed标志,以使处置的线程一旦被杀死就不会触发。

 if(mThread != nullptr)
 {
     auto dispose = std::move(mThread);
     dispose->detach();
     mThread.reset(new Thread([&]()
    {
        sleep(std::chrono::milliseconds(mDelay));
    });
  }