簡體   English   中英

將WIN32應用程序移植到Linux-事件在Linux中如何工作?

[英]Porting WIN32 Application to Linux - How does event work in Linux?

我有一個WIN32應用程序,並將其移植到LINUX GNU。 我在WIN32應用程序中有基於事件的C代碼。 現在,我嘗試了幾種在GNU linux中實現相同方法的方法,但是以某種方式,我感到這段代碼無法正常工作。

首先,我創建了一個用於實現事件的結構。

typedef struct _Event
   {
      int m_bool;
      pthread_mutex_t m_mutex;
      pthread_cond_t m_condition;

   }MyEvent, * Event_handle;

為了實現“ 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對m_mutex和m_bool的用法感到困惑。 我正在尋找的是示例代碼或演示。

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

看來,我找到了你想要的。 我不確定。 我的第一個想法是您不了解為什么互斥鎖在這里。 我會先解釋一下。

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

在POSIX世界中,您需要顯式設置互斥鎖。 一個重要的注意事項:沒有ResetEvent -link行為-您不需要重置條件變量; 但是,您需要解鎖互斥鎖。 可能, 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()函數。

進一步閱讀:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM