首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程同步@本机Android

线程同步@本机Android
EN

Stack Overflow用户
提问于 2012-03-16 07:14:09
回答 2查看 3.3K关注 0票数 1

Windows CRITICAL_SECTION的实现方式比互斥锁轻(就锁/解锁成本而言),使用自旋锁和信号量来减少用户/内核开关。

一个互斥锁需要一个上下文开关,即使互斥锁目前没有被拥有/锁定,其中一个CRITICAL_SECTION只会在一段时间后才恢复自旋锁(结果是更好的perf )。

我是Android的新手,考虑到windows CRITICAL_SECTION,在本地Android中有类似的版本吗?

有比pthread_mutex_轻的吗?@ Android?“pthread_mutex_.”强制设置上下文开关,即使互斥对象尚未被~拥有/锁定~(就像在windows中那样)?

考虑到快速输入/退出关键部分,“pthread_mutex_”的使用成本是多少。强加?

有没有用户模式的spinlock @本地Android?

任何帮助都将不胜感激。

纳达夫在索芬

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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()相当轻量级。

票数 5
EN

Stack Overflow用户

发布于 2012-03-16 08:14:07

下面是一些将p线程互斥封装到windows样式CRITICAL_SECTION中的内容

代码语言:javascript
复制
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!
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9733331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档