【问题标题】:Wake thread and exit from sleep唤醒线程并退出睡眠
【发布时间】:2016-12-27 14:13:52
【问题描述】:

我有一个看起来像这样的单例类:

//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; }
    }
}

我在this page 上找到了这段代码,老实说,我真的不知道它是如何工作的。但是这个人和我有同样的问题,我认为这对我的情况有用,但它没有。

所以我目前拥有的是一个线程t_thread,它永远运行,它做了一些工作,然后休眠 1000 秒,然后又重新开始。我需要的是某种方法来将此线程从睡眠中唤醒并退出它。所以SomeOtherFunction() 可以完成它的工作,然后重新启动线程。

为什么这段代码不起作用,我怎样才能让它起作用?

【问题讨论】:

  • 从问题中删除答案并添加为答案。
  • @SteveM 完成。谢谢。

标签: c++ multithreading


【解决方案1】:

我回到原来的帖子并做了:

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);
}

现在可以了。还是谢谢。

【讨论】:

    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 2020-05-21
    • 2011-07-29
    • 1970-01-01
    • 2011-06-01
    • 2011-03-28
    相关资源
    最近更新 更多