在调查一些性能问题时,我最终进入了 gthread-posix.c。在那里我找到了如下代码:
static void __attribute__((noinline))
g_mutex_lock_slowpath (GMutex *mutex)
{
/* Set to 2 to indicate contention. If it was zero before then we
* just acquired the lock.
*
* Otherwise, sleep for as long as the 2 remains...
*/
while (exchange_acquire (&mutex->i[0], 2) != 0)
syscall (__NR_futex, &mutex->i[0], (gsize) FUTEX_WAIT, (gsize) 2, NULL);
}
我很好奇为什么它在这里和其他地方不使用 FUTEX_WAIT_PRIVATE。至少在 ARM 上,非私有 futex 的速度要慢得多,而且我的印象是 glib 用于多线程而不是共享内存中的进程间通信。