2012-03-16 59 views
1

通過使用自旋鎖和信號量來減少用戶/內核切換,Windows CRITICAL_SECTION以比互斥體輕的方式實現(就鎖/解鎖性能而言)。線程同步@原生Android

即使互斥鎖當前沒有擁有/鎖定,只有在旋轉鎖定的一段時間後纔會請求CRITICAL_SECTION纔會請求互斥鎖(導致更好的性能),互斥鎖需要上下文切換。

我是新來的Android本機開發,考慮Windows CRITICAL_SECTION,是否有一個相當於原生Android?

有什麼比pthread_mutex_ 更輕的東西。 @ Android? 'pthread_mutex_ '強加一個上下文切換,即使該互斥量不是已擁有/鎖定〜(如在Windows中)?

考慮快速進入/退出臨界區段'pthread_mutex_ 的使用成本是多少?'強加?

是否有用戶模式spinlock @ Native Android?

任何幫助將不勝感激。

Nadav在Sophin

+0

你對android設備鎖定/解鎖在本地層,即在c/c + +的任何想法。 – CoDe 2012-06-08 15:52:53

回答

4

沒有,pthread_mutex_lock()在Android的仿生libc中不徵收上下文切換爲鎖定一個正常的互斥無序狀態 - 使用簡單的原子比較和交換,然後是內存屏障。同樣,如果沒有進程在等待,則解鎖互斥體不需要內核入口。

您可以在Bionic libc源代碼中找到pthread_mutex_lock()pthread_mutex_unlock()的仿生實現,並自己查看。

一般來說,你可以考慮pthread_mutex_lock()/pthread_mutex_unlock()是相當輕量級。

3

以下是一些封裝並行線程互斥成windows風格CRITICAL_SECTION

typedef struct tagCRITICAL_SECTION { 
    pthread_mutex_t  _mutex; 
    pthread_mutexattr_t _mutexattr; 
} CRITICAL_SECTION, *LPCRITICAL_SECTION; 


static inline 
VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) { 
    // printf("[init] %0x\n", (UINT)lpCriticalSection); 
    int ret; 
    ret = pthread_mutexattr_init(&(lpCriticalSection->_mutexattr)); 
    assert(ret==0); 
#if defined (__APPLE__) || defined(__linux__) 
    pthread_mutexattr_settype(&lpCriticalSection->_mutexattr, PTHREAD_MUTEX_RECURSIVE); 
#elif ANDROID 
    // Do nothing 
#else 
    lpCriticalSection->_mutexattr.__mutexkind = PTHREAD_MUTEX_RECURSIVE_NP; 
#endif 
    ret = pthread_mutex_init(&(lpCriticalSection->_mutex), 
          &(lpCriticalSection->_mutexattr)); 
    assert(ret==0); 
} 

static inline 
VOID DeleteCriticalSection (LPCRITICAL_SECTION lpCriticalSection) { 
    int ret; 
    ret = pthread_mutex_destroy (&(lpCriticalSection->_mutex)); 
    assert(ret==0); 
    ret = pthread_mutexattr_destroy(&(lpCriticalSection->_mutexattr)); 
    assert(ret==0); 
} 

static inline 
VOID EnterCriticalSection  (LPCRITICAL_SECTION lpCriticalSection) { 
    int ret; 
    ret = pthread_mutex_lock(&(lpCriticalSection)->_mutex); 
    assert(ret==0); 
} 

static inline 
BOOL TryEnterCriticalSection  (LPCRITICAL_SECTION lpCriticalSection) { 
    int ret; 
    ret = pthread_mutex_trylock(&(lpCriticalSection)->_mutex); 

    return ret == 0; 
} 

static inline 
VOID LeaveCriticalSection  (LPCRITICAL_SECTION lpCriticalSection) { 
    int ret; 
    ret = pthread_mutex_unlock(&(lpCriticalSection->_mutex)); 
    // ret==1 means mutex is owned by another thread! 
} 
+0

這個實現非常方便,TnX!然而,它只是簡單地包裝aounf pthread互斥體而不實現自旋鎖邏輯,Any1意識到用戶模式自旋鎖實現? – NadavRub 2012-03-16 11:53:02