2013-09-23 90 views
1
class Class { 
public: 
    Class(); 
private: 
    std::thread* updationThread; 
}; 

構造:暫停的std ::線程,直到功能完成

Class::Class() { 
    updationThread = new std::thread(&someFunc); 
} 

在我的應用程序的某個時刻,我必須暫停該線程和調用函數和函數我要執行後恢復線程。比方說,它發生在這裏:

void Class::aFunction() { 
    functionToBeCalled(); //Before this, the thread should be paused 
    //Now, the thread should be resumed. 
} 

我曾嘗試使用另一個線程與功能functionToBeCalled()和使用thread::join,但無法做到,由於某種原因。

如何暫停一個線程或者我如何使用thread::join暫停線程,直到其他完成?

+0

那是什麼其他的線程在做什麼?你可以玩「someFunc」的身體嗎? 「暫停」線程不是正常操作。 – user7116

+0

STL不提供此。在Windows中,您可以使用SuspendThread。 – cdoubleplusgood

+0

@ user7116我可以。我想這樣做的原因是因爲當'functionToBeCalled()'和線程一起工作時,我遇到了內部問題。 – khajvah

回答

4

我不認爲你可以很容易地(以標準的方式)「暫停」某個線程,然後恢復它。我想你可以發送SIGSTOP和SIGCONT如果你是使用一些Unix味的操作系統,但除此之外,你應該正確標註內someFunc()原子零件與互斥和鎖,一個包裹functionToBeCalled()與相應的互斥鎖:

std::mutex m; // Global mutex, you should find a better place to put it 
       // (possibly in your object) 

,並在函數內部:

void someFunc() { 
    // I am just making up stuff here 
    while(...) { 
     func1(); 

     { 
      std::lock_guard<std::mutex> lock(m); // lock the mutex 
      ...; // Stuff that must not run with functionToBeCalled() 
     } // Mutex unlocked here, by end of scope 
    } 
} 

,並呼籲functionToBeCalled()時:

void Class::aFunction() { 
    std::lock_guard<std::mutex> lock(m); // lock the mutex 
    functionToBeCalled(); 
} // Mutex unlocked here, by end of scope 
+0

更重要的是,*你不想「暫停」*。如果'B'在B運行時不能運行,它們必須共享一些數據依賴。簡單地暫停執行'A'的線程並不能保證當'A'處於適當和/或一致的狀態w'r.t時'B'將運行。數據依賴性(即保護處理共享數據的部分是正確答案)。 – user7116

+0

@ user7116當文件被修改時,我的線程很簡單地捕獲信號。我用它來知道文件在應用程序外部何時被修改。該功能修改文件。它寫入一些文件並在寫入第一個字符串之後,線程工作並且應用程序崩潰,因爲函數不會將所有內容寫入文件 – khajvah

+0

@ user7116當文件寫入所有內容時,我不認爲崩潰會發生。 – khajvah