2013-02-19 103 views
1

我有一個WIN32應用程序,我將它移植到LINUX GNU。我在WIN32應用程序中有事件庫C代碼。現在我已經嘗試了幾種在GNU linux中實現相同的方法,但不知何故,我感覺這段代碼無法正常工作。將WIN32應用程序移植到Linux - 事件在Linux中如何工作?

首先,我創建了一個實現事件的結構。爲了實現'SetEvent','ResetEvent','WaitForSingleObject',我實現了下面的代碼。

MyEvent CreateEvent(void) 
    { 
     MyEvent e1; 
     e1.m_bool = 1; 
     return e1; 
    } 

    void SetEvent(MyEvent evt) 
    { 
     evt.m_bool = 1; 
     pthread_cond_broadcast(&evt.m_condition); 
    } 

    void ResetEvent(MyEvent evt) 
    { 
     evt.m_bool = 0; 
     pthread_cond_broadcast(&evt.m_condition); 
    } 

    int WaitForSingleObject(MyEvent evt, unsigned timeout) 
    { 
     pthread_cond_wait(&(evt.m_condition),&(evt.m_mutex)); 
     return SUCCESS; 
    } 

現在我們對m_mutex和m_bool的用法感到困惑。我正在尋找的是一個示例代碼或演示。

我已經嘗試了所有鑰匙到鎖上,但似乎門仍然鎖着。任何幫助都可以。謝謝 !

+0

爲什麼你需要'm_bool'? – 2013-02-19 10:11:55

+0

我保留它的事件狀態。我可以檢查m_bool以確定事件是否已設置。 – 2013-02-19 10:12:56

+0

您是否從Windows Mobile的應用程序移植? – 2013-02-19 10:16:09

回答

1

看來,我找到了你想要的東西。雖然我不確定。我的第一個想法是你不明白爲什麼互斥體在這裏。我會先嚐試解釋它。

在Windows©,當你調用WaitForSingleObject(),它會阻止執行,直到你(的信號狀態,SetEvent()或設置一個事件,在Windows術語)發送的信號。基本上,它是通過在事件對象內設置一個隱式互斥鎖來完成的,將它鎖定在函數中並等待一個信號。

在POSIX世界中,您需要明確設置互斥鎖。一個重要的通知:沒有ResetEvent-鏈接行爲 - 你不需要重置你的條件變量;但是,您需要解鎖互斥鎖。 ResetEvent()函數的唯一目的可能是解除該隱式互斥鎖。

void SetEvent(MyEvent evt) 
{ 
    pthread_cond_signal(&evt.m_condition); 
} 

void ResetEvent(MyEvent evt) 
{ 
    pthread_mutex_unlock(&evt.m_mutex); 
} 

int WaitForSingleObject(MyEvent evt, unsigned) 
{ 
    pthread_mutex_lock(&evt.m_mutex); 
    pthread_cond_wait(&evt.m_condition, &evt.m_mutex); 
} 

在你的情況下,pthread_cond_signal()更合適。另請注意,您需要使用pthread_cond_timedwait()函數來模擬WaitForSingleObject()函數。

延伸閱讀:

+0

是的,我實際上對互斥體的用法感到困惑......而你在答案中所說的是有道理的..我試了一下。非常感謝你的輸入! :-) – 2013-02-20 04:31:00

相關問題