2011-05-26 17 views
9

Estoy tratando de hacer algo de multihilo con el Android Native Development Kit, así que necesito un mutex en el lado de C++.Android NDK Mutex

¿Cuál es la forma correcta de crear y utilizar un mutex con Android NDK?

Gracias

Respuesta

9

El NDK parece tener soporte para pthread mutexes. No los he usado yo mismo.

+0

Gracias. Me encontré con un montón de mensajes que decían que esto aún no se había implementado, pero deben haber sido muy antiguos. Escribí un pequeño módulo para NDK usando pthread, y lo compilé, pero nunca intenté ejecutarlo. Pude hacer el enhebrado en el lado de Java. Gracias de todos modos, probablemente termine usando el módulo en algún momento. – bitwise

+2

Comentario para la posteridad: Tengo una aplicación que está usando pthread's, así como pthread mutex, y está funcionando bien, por lo que parece que están implementados y funcionan. –

7

Así es como vamos en Windows y Android (OS_LINUX definir es para Android):

class clMutex 
{ 
public: 
    clMutex() 
    { 
#ifdef OS_LINUX 
     pthread_mutex_init(&TheMutex, NULL); 
#endif 
#ifdef OS_WINDOWS 
     InitializeCriticalSection(&TheCS); 
#endif 
    } 

    /// Enter the critical section -- other threads are locked out 
    void Lock() const 
    { 
#ifdef OS_LINUX 
     pthread_mutex_lock(&TheMutex); 
#endif 
#ifdef OS_WINDOWS 

     if (!TryEnterCriticalSection(&TheCS)) EnterCriticalSection(&TheCS); 
#endif 
    } 

    /// Leave the critical section 
    void Unlock() const 
    { 
#ifdef OS_LINUX 
     pthread_mutex_unlock(&TheMutex); 
#endif 
#ifdef OS_WINDOWS 
     LeaveCriticalSection(&TheCS); 
#endif 
    } 

    ~clMutex() 
    { 
#ifdef OS_WINDOWS 
     DeleteCriticalSection(&TheCS); 
#endif 
#ifdef OS_LINUX 
     pthread_mutex_destroy(&TheMutex); 
#endif 
    } 

#ifdef OS_LINUX 
    // POSIX threads 
    mutable pthread_mutex_t TheMutex; 
#endif 
#ifdef OS_WINDOWS 
    mutable CRITICAL_SECTION TheCS; 
#endif 
}; 

Como uno de los desarrolladores de Linderdaum Engine recomiendo echar un vistazo a Mutex.h en nuestro SDK.

6
#include <pthread.h> 

class CThreadLock 
{ 
public: 
    CThreadLock(); 
    virtual ~CThreadLock(); 

    void Lock(); 
    void Unlock(); 
private: 
    pthread_mutex_t mutexlock; 
}; 

CThreadLock::CThreadLock() 
{ 
    // init lock here 
    pthread_mutex_init(&mutexlock, 0); 
} 

CThreadLock::~CThreadLock() 
{ 
    // deinit lock here 
    pthread_mutex_destroy(&mutexlock); 
} 
void CThreadLock::Lock() 
{ 
    // lock 
    pthread_mutex_lock(&mutexlock); 
} 
void CThreadLock::Unlock() 
{ 
    // unlock 
    pthread_mutex_unlock(&mutexlock); 
} 
+0

esta pregunta tiene un año ... y ya ha sido respondida. – bitwise