我有一段代码需要快速运行,现在我正在使用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,这可能会更快,而且更容易