唤醒线并退出睡眠

Wake thread and exit from sleep

本文关键字:退出 唤醒      更新时间:2023-10-16

我有一个单身类,看起来像:

//Test.h
class Test
{
private:
    static std::mutex mtx;
    static std::condition_variable cv;
    static bool end;
    static void DoSomethingThread();
    static void SomeOtherFunction();
public:
    static void Start();
}
//Test.cpp
std::mutex Test::mtx;
std::condition_variable Test::cv;
bool Test::end = false;
void Test::Start() 
{
    std::thread t_thread(Test::DoSomethingThread);
    while(a) {
        if (b) {
            // End thread.
            std::unique_lock<std::mutex> lock(mtx);
            Test::end = true;
            Test::cv.notify_one();
            t_thread.join();
            Test::SomeOtherFunction();
            // Restart thread.
            Test::end = false;
            t_thread = std::thread(Test::DoSomethingThread);
        }
        ...
    }
}
void Test::DoSomethingThread()
{
    std::unique_lock<std::mutex> lock(mtx);
    while (1) {
        //Do some work here.
        Test::cv.wait_for(lock, std::chrono::seconds(1000), []() { return Test::end; });
        if (Test::end) { break; }
    }
}

我在此页面上找到了此代码,老实说,我真的不知道这是如何工作的。但是那个家伙和我遇到了同样的问题,我认为这对我的案子有用,但没有。

因此,我目前拥有的是一个线程t_thread,它可以永远运行,它可以进行一些工作,然后睡1000秒,然后再一次。我需要的是将此线从睡眠中唤醒并退出它。因此SomeOtherFunction()可以完成其工作,然后重新启动线程。

为什么此代码不起作用,我该如何工作?

我回到了原始帖子,做到了:

if (b) {
    {       
        // End thread.
        std::unique_lock<std::mutex> lock(mtx);
        Test::end = true;
        Test::cv.notify_one();
    }   
    t_thread.join();
    Test::SomeOtherFunction();
    // Restart thread.
    Test::end = false;
    t_thread = std::thread(Test::DoSomethingThread);
}

现在起作用。谢谢。