线程同步@nativeandroid

线程同步@nativeandroid,android,android-ndk,linux-kernel,pthreads,Android,Android Ndk,Linux Kernel,Pthreads,Windows CRITICAL_部分的实现方式比互斥体轻(就锁定/解锁性能成本而言),它利用自旋锁和信号量来减少用户/内核切换 即使互斥体当前未被拥有/锁定,但互斥体也需要上下文切换,而关键_部分只有在自旋锁上经过一段时间后才会请求上下文切换(从而获得更好的性能) 我是Android本机开发人员的新手,考虑到windows CRITICAL_部分,本机Android中是否有类似的功能 有比pthread\u mutex\ux更轻的吗安卓“pthread_mutex_.”是否会强制执行上下文切换

Windows CRITICAL_部分的实现方式比互斥体轻(就锁定/解锁性能成本而言),它利用自旋锁和信号量来减少用户/内核切换

即使互斥体当前未被拥有/锁定,但互斥体也需要上下文切换,而关键_部分只有在自旋锁上经过一段时间后才会请求上下文切换(从而获得更好的性能)

我是Android本机开发人员的新手,考虑到windows CRITICAL_部分,本机Android中是否有类似的功能

有比pthread\u mutex\ux更轻的吗安卓“pthread_mutex_.”是否会强制执行上下文切换,即使互斥对象尚未拥有/锁定(如在windows中)

考虑到快速进入/退出关键部分,“pthread\u mutex\u”的使用成本是多少

原生Android是否有用户模式自旋锁

任何帮助都将不胜感激


Sophin的Nadav

下面是将pthread互斥体封装到windows风格的关键部分

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!
}

下面是将pthread互斥体封装到windows风格的关键部分

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!
}

不,Android的仿生libc中的
pthread\u mutex\u lock()
没有设置上下文开关,用于将正常的互斥锁锁定在非竞争状态-使用了一个简单的原子比较和交换,然后是一个内存屏障。同样,如果没有进程等待,解锁互斥锁也不需要内核条目

您可以在仿生libc源代码的
libc/Bionic/pthread.c
中找到
pthread\u mutex\u lock()
pthread\u mutex\u unlock()
的仿生实现,并亲自查看


一般可以考虑<代码> pthRead MutExxLoad()代码> pthRead MutExxOnLoCub(/Cord>)是相当轻量级的。

< P>不,在Android的仿生LBC中,<代码> pthRead MutExxLoad()/代码>不强加上下文切换来锁定未争用状态中的正常互斥体——使用简单的原子比较和交换,接着是记忆障碍。同样,如果没有进程等待,解锁互斥锁也不需要内核条目

您可以在仿生libc源代码的
libc/Bionic/pthread.c
中找到
pthread\u mutex\u lock()
pthread\u mutex\u unlock()
的仿生实现,并亲自查看


一般可以考虑<代码> pthRead MutExxLoad()>/Cuth.pthRead MutExxOnLoCub(/Cord>)是相当轻量级的。

此实现相当方便,TNX!!!!然而,它只是简单地包装aounf pthread mutex,不实现自旋锁逻辑,任何人都知道用户模式自旋锁实现?这个实现非常方便,TnX!!!但是,它只是简单地包装aounf pthread mutex,不实现自旋锁逻辑,任何人都知道用户模式自旋锁的实现吗?你知道安卓设备在本机层(即在c/c++)的锁定/解锁吗?你知道安卓设备在本机层(即在c/c++)的锁定/解锁吗。