sem_post / sem_wait是否比pthread_mutex_lock / pthread_mutex_unlock快得多?

问题描述

| 我有一个需要快速运行的代码块,现在我正在使用
pthread_mutex_lock/pthread_mutex_unlock
来同步线程,但是我发现它对性能有一定的影响。我在徘徊,如果有人对它进行了基准测试,ѭ1的速度明显快于ѭ0的速度吗? 谢谢!     

解决方法

我想说一个信号量可能比互斥量慢,因为信号量具有互斥量行为的超集。您可以尝试在用户级别进行某些操作,例如在没有内核支持的情况下运行的自旋锁,但这完全取决于锁定/解锁的速度和争用。     ,不,它的速度不是很快。它们使用相同的较低级原语(读取自旋锁和系统调用)实现。真正的答案虽然只会在您的特定情况下进行比较。     ,我希望它们的速度大致相同,但是如果您真的很在意,您可以始终自己进行基准测试。话虽这么说,POSIX信号量确实有一个,而就我所关心的只有一个,它比更复杂的原语(例如互斥量和条件变量)具有优势::3ѭ必须是异步信号安全的。它是唯一与同步相关的,异步信号安全的函数,它使在信号处理程序的线程之间执行最小交互成为可能! -如果没有诸如管道或SysV IPC之类的较重工具,这些工具将无法与面向性能的pthread习惯用法很好地交互,那么这是不可能的。 编辑:供参考,
pthread_mutex_trylock
的最简单实现:
if (mutex->type==PTHREAD_MUTEX_DEFAULT) return atomic_swap(mutex->lock,EBUSY);
else /* lots of stuff to do */
sem_trywait
的最简单实现:
int val = sem->val;
return (val>0 && atomic_compare_and_swap(sem->val,val,val-1)==val) ? 0 : EAGAIN;
假设实现最佳,我猜想互斥锁可能会稍快一些,但还是要对其进行基准测试。     ,如果您使用的是Objective C,则您的环境可能与Cocoa足够近,可以使用Grand Central Dispatch,这可能会更快,而且绝对会更容易