2016-12-27 143 views
0

我有一个单独的类,看起来是这样的:唤醒线程和退出睡眠

//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()可以做它的工作,然后重新启动线程。

为什么这段代码不工作,我该如何让它工作?

+2

删除问题的答案并添加为答案。 –

+1

@SteveM完成。谢谢。 – user1806687

回答

0

我又回到原来的岗位,做:

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

而且现在的工作。不管怎么说,还是要谢谢你。