1

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_mutex と m_bool の使用法について混乱しています。私が探しているのは、サンプル コードまたはデモです。

すべての鍵を施錠してみましたが、ドアがまだ施錠されているようです。どんな助けでも構いません。ありがとう !

4

1 に答える 1

1

どうやら、あなたが欲しいものを見つけたようです。よくわかりませんが。私の最初の考えは、ミューテックスがここにある理由を理解していないということでした。最初に説明してみます。

Windows© では、 を呼び出すとWaitForSingleObject()、シグナルを送信するまで実行がブロックされます (またはSetEvent()、Windows 用語でシグナル状態のイベントを設定します)。基本的には、イベント オブジェクト内に暗黙のミューテックスを設定し、WaitForSingleObject()関数内でロックしてシグナルを待機することによって行われます。

POSIX の世界では、ミューテックスを明示的に設定する必要があります。1 つの重要な注意: ResetEvent-link 動作はありません。条件変数をリセットする必要はありません。ただし、ミューテックスのロックを解除する必要があります。おそらく、この関数の唯一の目的は、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()

参考文献:

于 2013-02-19T12:51:59.897 に答える