Windows CRITICAL_SECTION的实现方式比互斥锁轻(就锁/解锁成本而言),使用自旋锁和信号量来减少用户/内核开关。
一个互斥锁需要一个上下文开关,即使互斥锁目前没有被拥有/锁定,其中一个CRITICAL_SECTION只会在一段时间后才恢复自旋锁(结果是更好的perf )。
我是Android的新手,考虑到windows CRITICAL_SECTION,在本地Android中有类似的版本吗?
有比pthread_mutex_轻的吗?@ Android?“pthread_mutex_.”强制设置上下文开关,即使互斥对象尚未被~拥有/锁定~(就像在windows中那样)?
考虑到快速输入/退出关键部分,“pthread_mutex_”的使用成本是多少。强加?
有没有用户模式的spinlock @本地Android?
任何帮助都将不胜感激。
纳达夫在索芬
发布于 2012-03-20 02:56:26
不,安卓的仿生libc中的pthread_mutex_lock()并没有强制设置上下文开关来锁定正常的互斥对象--使用一个简单的原子比较和交换,然后是一个内存屏障。同样,如果没有进程等待,则解除互斥锁不需要内核条目。
您可以在Bionic源代码中找到pthread_mutex_lock()和pthread_mutex_unlock()在libc/bionic/pthread.c中的仿生实现,并亲自查看。
通常,您可以认为pthread_mutex_lock() / pthread_mutex_unlock()相当轻量级。
发布于 2012-03-16 08:14:07
下面是一些将p线程互斥封装到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!
}https://stackoverflow.com/questions/9733331
复制相似问题