2016-12-27 173 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); 
} 

而且現在的工作。不管怎麼說,還是要謝謝你。