2013-09-23 24 views
0

問題: 首先,這是我的問題的一個簡化示例,它實際上是已經由其他人編寫的大型框架的一部分,我必須在其中調整我的代碼。多對一的條件線程鎖

我有3個功能。兩個函數(函數1和函數2)被程序的其他部分異步同步調用。 我的最後一個函數(function3)連續運行,就像一個while循環一樣,它唯一做的就是在每次代碼迭代時觸發一個事件代碼。 我只希望這個最後一個函數在兩個其他函數之一完成迭代/被調用時運行。 我不能改變他們被調用的方式/時間,我只能阻止代碼的執行並取消阻止它。

我對C++相當陌生,我試着用互斥鎖來解決這個問題,但我沒有運氣。 我可以添加代碼,但它確實就像我解釋的。

void function1(){ // this function is called by other parts of the program 
//some code 
} 

void funtion2(){ //this function is also called by other parts of the program 
//some other code 
} 

void function3(){ //this function runs continuously, similar to a while loop with a 1ms sleep in it 

fireEvent();//fires an event to run some other code 
} 

因此,功能3運行除非擋住了所有的時間,我只想每一個的其他功能之一有一個運行時通過運行該功能。就像我之前說過的,我不能自己調用​​function3,我只能操作函數中的代碼。

這樣做的最好方法是什麼?

激烈的googleing後,我只提出了條件變量,信號量和互斥量,但我不知道他們知道如何正確地實現它。

任何幫助/輸入/提示,非常感謝。

+0

你不太確定的一件事是函數3()中的處理程序代碼是否應該匹配函數function1()和函數function2()的調用次數。即如果'function1()'被調用兩次,'function2()'三次,'function3()'中的迭代循環是否應該* – WhozCraig

+0

對不起。實際上,這兩個函數總是會被同時調用,但並不總是能夠確定它們都會被調用,有時候只是其中的一個。但是,當兩者都被召喚時,它是在同一時間。在這兩種情況下,我只想讓function3運行一次。就像一個OR,如果其中一個運行,然後運行function3,如果兩者都運行,那麼仍然運行一次function3。 – trudesagen

+0

編輯爲上面的那個。實際上,將會有16個這些函數喚醒函數3。函數總是會被同時調用,但並不總能確定所有函數都會被調用,有時可能是一半,有時只是一個。在所有情況下,我只想要function3運行一次。像OR一樣,如果其中一個運行,則運行function3,如果它們中的更多運行在同一時間,則仍然只運行一次function3。 – trudesagen

回答

1

一個straigtforward的方法是這樣的:

mutex g_mutex; 
condition_variable g_cond; 
bool flag = false; 
void function1(){ // this function is called by other parts of the program 
    //some code 
    lock_guard<mutex> lock(g_mutex); 
    flag = true; 
    g_cond.notify_one(); 
} 

void funtion2(){ //this function is also called by other parts of the program 
    //some other code 
    lock_guard<mutex> lock(g_mutex); 
    flag = true; 
    g_cond.notify_one(); 
} 

void function3(){ //this function runs continuously, similar to a while loop with a 1ms sleep in it 
    { 
     unique_lock<mutex> lock(g_mutex); 
     g_cond.wait(lock, []{return flag;}); // wait here until func1 or func2 have been called 
     flag = false; 
    } 
    fireEvent();//fires an event to run some other code 
} 

int main() { 
// your code goes here 
return 0; 
} 

但是,這將阻止您function3直到其他三三兩兩的一個被調用。所以這是行爲的變化,並增加了額外的鎖爭用。

+0

我還沒有測試過這個代碼,但是如果兩個函數同時被調用會發生什麼?如果cond-var已被通知,通知是否會提供錯誤?請原諒,如果這是一個愚蠢的問題。 – trudesagen

+0

@trudesagen:不,您可以根據需要經常通知病情。如果沒有人在等待它,通知將會丟失。所以布爾旗。 – mkaes

+0

明天我會測試這個,好像有一些缺少的庫,我需要先修復。謝謝你的反饋。 – trudesagen