sem_post / sem_wait比pthread_mutex_lock / pthread_mutex_unlock快得多吗?

我有一段代码需要快速运行,现在我正在使用pthread_mutex_lock/pthread_mutex_unlock同步这些线程,但是我看到它对性能有一定的影响。 我徘徊,如果有人以此为基准,是sem_post/sem_wait 明显pthread_mutex_lock/pthread_mutex_unlock更快?

谢谢!

我认为信号量可能比互斥量要慢,因为信号量具有互斥行为的超集。 你可以尝试一些用户级别的东西,比如没有内核支持的自旋锁,但这一切都取决于锁定/解锁和争用的速度。

不,这不是很快。 它们使用相同的较低级别的基元(读取自旋锁和系统调用)来实现。 真正的答案虽然只会在你的特定情况下进行比较。

我希望他们的速度大致相同,但是如果你真的关心的话,你可以自己来测试。 有了这个说法,POSIX信号量确实有一个 ,就我所关心的只有一个而言 ,它比更复杂的基元(如互斥锁和条件变量)更具优势: sem_post必须是异步信号安全的。 它是唯一的同步相关的函数,它是异步信号安全的,它使得从信号处理程序执行线程间的最小交互成为可能! – 如果没有像管道或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,这可能会更快,而且更容易