2014-01-27 56 views
0

我有一個運行在線程中的函數f1,並且它不斷地執行一個計算c1。在一個正在運行的線程中處理一個事件

但是當一個特殊事件發生時,f1必須做計算c2(而不是計算c1)。

我該如何執行此操作? 我已經搜索了很多,生產者 - 消費者案例或條件鎖不適合我的實現(我這麼認爲),因爲我不希望線程停止,直到事件發生。

任何人都可以幫我嗎?

預先感謝您

class myclass 
{ 
    void f1 (void) 
    { //I do not want the f1 stop, it has to do its work, and when f2 send an event to him, act different 
     while (1) { 
      if(there is an event from f2) 
       do c2; 
      else 
       do c1; 
      // I do not want to loose any event either 
     } 
    } 

    void f2(void) 
    {//f2 runs in parralel to f1 
    } 

    void execute() 
    { 
     // f1_thread do calculations (c1) continiously 
     boost::thread* f1_thread = new boost::thread(boost::bind(&myclass::f1, this)); 
     // f2_thread has to send an event to force the f1_thread (once a while) to do calculation c2 instead of c1 
     boost::thread* f2_thread = new boost::thread(boost::bind(&myclass::f2, this)); 
    } 
} 
int main() 
{ 
    myclass _myclass; 
    _myclass.execute(); 
} 

我想要的「F1」停止「C1」計算,並立即切換到計算C2每當「F2」給他發個信號(我不知道信號還)。計算c1非常耗時,如果我使用「if子句」,當事件發生時,「c2」直到「c1」結束才能運行。

+1

您能否回答我,而不是僅僅投票-1?我是新來的線程,我想開始使用事件。如果問題很簡單,寫一個答案。謝謝 –

+0

這個*'我不想用'if'的原因是我的計算非常耗時,如果我使用「if」,當f2發生變化時,f1在下一輪之前不會注意到它。 '*完全沒有意義 - 請嘗試更加清楚地解釋。 –

+0

@JohannGerell感謝您的關注,我希望「f1」停止「c1」計算,並在每當「f2」向他發送一個信號(我不知道有關信號)時立即切換到計算c2。計算c1非常耗時,如果我使用「if子句」,當事件發生時,「c2」直到「c1」結束才能運行。希望清楚。謝謝 –

回答

1

在問題中給出更多信息之前,您是否對主題'簡單函數指針交換'進行了任何修改?

typedef void (*CALC_FUNC)(); 

void c1() { ... } 
void c2() { ... } 
volatile CALC_FUNC calcFunc; 

class myclass 
{ 
    void f1 (void) 
    { 
     while (1) { 
      // Provided that your platform's function pointer 
      // assigment is atomic (otherwise do an interlocked 
      // operation) 
      CALC_FUNC func = calcFunc; 
      func(); 
     } 
    } 

    void f2(void) 
    { 
     // Provided that your platform's function pointer 
     // assigment is atomic (otherwise do an interlocked 
     // operation) 
     if(someCondition) calcFunc = c2; 
     else if(someOtherCondition) calcFunc = c1; 
    } 

    void execute() 
    { 
     calcFunc = c1; 

     // f1_thread do calculations (c1) continiously 
     boost::thread* f1_thread = new boost::thread(boost::bind(&myclass::f1, this)); 
     // f2_thread has to send an event to force the f1_thread (once a while) to do calculation c2 instead of c1 
     boost::thread* f2_thread = new boost::thread(boost::bind(&myclass::f2, this)); 
    } 
} 
+0

這是一個有用的答案,但我希望類型「c1」的計算立即改爲鍵入「c2」。還有其他想法嗎?再次感謝你。 –

+0

你不能立即改變它。每個c1和c2中的代碼必須在使用新的「計算器」之前執行並返回。改變裏面的內容的唯一方法就是和函數指針交換(改變計算「策略」)一樣。 –

相關問題