[gameprogrammer] Re: WaitFOrMultipleObjects on Linux?

  • From: 唐为 <twpig2003@xxxxxxxxxxx>
  • To: <gameprogrammer@xxxxxxxxxxxxx>
  • Date: Sun, 30 Aug 2009 06:37:54 +0000


Hi, buddy:

I want to say some words premature:

i think we can use pthread_cond_signal to notify the event
And maybe we should lock it with phread_mutex_lock & pthread_mutex_unlock
and it maybe better to arrange pthread_cond_t and pthread_mutex_t, i mean, a 
struct(you can fill something else you want, e.g. for ResetEvent)

You can read the super book(I haven't its book or pdf now)
unix network programming volume 2(or maybe volume 1?)
there is some sample code in it.

And maybe you can read the source code of ACE(it did some wrapping work to 
cross platforms)





 
    pthread_cond_t eventList[4];
    pthread_mutex_t hMutex[4];
    

 
#include "SignaledEvent.h"
#include "RakAssert.h"
 
SignaledEvent::SignaledEvent()
{
    numEvents=0;
}
SignaledEvent::~SignaledEvent()
{
    CloseEvents();
}
 
void SignaledEvent::InitEvents(int numberOfEvents)
{
    numEvents=numberOfEvents;
    RakAssert(numberOfEvents<4);
    for (int i=0; i < numEvents; i++)
    {
#ifdef _WIN32
        eventList[i]=CreateEvent(0, true, false, 0);
#else
        pthread_mutex_init(&hMutex[i],NULL);
        pthread_cond_init(&eventList[i], NULL);
#endif
    }
}
 
void SignaledEvent::CloseEvents(void)
{
    for (int i=0; i < numEvents; i++)
    {
#ifdef _WIN32
        CloseHandle(eventList[i]);
#else
        pthread_cond_destroy(&eventList[i]);
        pthread_mutex_destroy(&hMutex[i]);
#endif
    }
    numEvents=0;
}
 
void SignaledEvent::ResetEvent(int index)
{
#ifdef _WIN32
    ::ResetEvent(eventList[index]);
#else
    ???
    // I think we can ignore it if we needn't manully reset the event to 
initial state.
#endif
}

void SignaledEvent::SetEvent(int index)
{
#ifdef _WIN32
    ::SetEvent(eventList[index]);
#else
    ???
    pthread_mutex_lock(&hMutex[i]);
    pthread_cond_signal(&eventList[index]);
    pthread_mutex_unlock(&hMutex[i]);
#endif
}
 
void SignaledEvent::ResetEvents(void)
{
    for (int i=0; i < numEvents; i++)
    {
#ifdef _WIN32
        ::ResetEvent(eventList[i]);
#else
        ???
        // I think we can ignore it if we needn't manully reset the event to 
initial state.
#endif
    }
}
 
void SignaledEvent::WaitOnEvents(int timeoutMs)
{
#ifdef _WIN32
    WaitForMultipleObjects(
        2,
        eventList,
        false,
        timeoutMs);
#else
    ???
    pthread_mutex_lock(&hMutex[i]);
    pthread_cond_wait( &eventList[i], &hMutex[i] );
    pthread_mutex_unlock(&hMutex[i]);
#endif
}



Thanks!



> Date: Sat, 29 Aug 2009 11:31:52 -0700
> From: gameprogrammer@xxxxxxxxxx
> To: gameprogrammer@xxxxxxxxxxxxx
> Subject: [gameprogrammer] WaitFOrMultipleObjects on Linux?
> 
> Anyone know how to fill this out? I put my guesses in, with ??? when I 
> didn't know
> 
>     pthread_cond_t eventList[4];
>     pthread_mutex_t hMutex[4];
> 
> #include "SignaledEvent.h"
> #include "RakAssert.h"
> 
> SignaledEvent::SignaledEvent()
> {
>     numEvents=0;
> }
> SignaledEvent::~SignaledEvent()
> {
>     CloseEvents();
> }
> 
> void SignaledEvent::InitEvents(int numberOfEvents)
> {
>     numEvents=numberOfEvents;
>     RakAssert(numberOfEvents<4);
>     for (int i=0; i < numEvents; i++)
>     {
> #ifdef _WIN32
>         eventList[i]=CreateEvent(0, true, false, 0);
> #else
>         pthread_cond_init(&eventList[i], NULL);
> #endif
>     }
> }
> 
> void SignaledEvent::CloseEvents(void)
> {
>     for (int i=0; i < numEvents; i++)
>     {
> #ifdef _WIN32
>         CloseHandle(eventList[i]);
> #else
>         pthread_cond_destroy(&eventList[i]);
>         pthread_mutex_destroy(&eventList[i]);
> #endif
>     }
>     numEvents=0;
> }
> 
> void SignaledEvent::ResetEvent(int index)
> {
> #ifdef _WIN32
>     ::ResetEvent(eventList[index]);
> #else
>     ???
> #endif
> }
> 
> void SignaledEvent::SetEvent(int index)
> {
> #ifdef _WIN32
>     ::SetEvent(eventList[index]);
> #else
>     ???
> #endif
> }
> 
> void SignaledEvent::ResetEvents(void)
> {
>     for (int i=0; i < numEvents; i++)
>     {
> #ifdef _WIN32
>         ::ResetEvent(eventList[i]);
> #else
>         ???
> #endif
>     }
> }
> 
> void SignaledEvent::WaitOnEvents(int timeoutMs)
> {
> #ifdef _WIN32
>     WaitForMultipleObjects(
>         2,
>         eventList,
>         false,
>         timeoutMs);
> #else
>     ???
>     pthread_cond_wait( &eventList[i], &hMutex[i] );
> #endif
> }
> 
> ---------------------
> To unsubscribe go to http://gameprogrammer.com/mailinglist.html
> 
> 

_________________________________________________________________
约会说不清地方?来试试微软地图最新msn互动功能!
http://ditu.live.com/?form=TL&swm=1

Other related posts: