我应该在这种特殊情况下使用spin_lock还是mutex_lock?

时间:2013-02-02 22:12:01

标签: c pthreads mutex spinlock

在我的Linux应用程序中,我有两个线程都尝试使用相同的UDP客户端套接字发送UDP广播数据包(大约50-500字节)。他们大约每2-3秒做一次。在这种情况下,围绕“send(...)”子句,我可以放置pthread_mutex_lockpthread_spin_lock。理论上说,如果它是一个非常小的操作,pthread_spin_lock更有效(尽管在很短的时间内CPU消耗很高)。但如果它的操作更大,那么pthread_mutex_lock会更好。

发送一个UDP数据包被认为是“足够小”以保证使用pthread_spin_lock,还是应该坚持使用pthread_mutex_lock

谢谢

3 个答案:

答案 0 :(得分:3)

如果只需要锁定是因为它们都在同一个套接字上发送,那么就根本不需要锁定 - 两个线程同时在同一个UDP套接字上调用send()是可以接受的时间。发送的数据不会交错。

答案 1 :(得分:1)

使用自旋锁而不是互斥锁可以避免在遇到拥塞时进入系统调用。如果您在关键部分使用网络层,无论如何您将进入系统调用。所以据我所知,使用自旋锁在这里没有多大意义。

答案 2 :(得分:1)

用螺旋锁包装系统调用是一个坏主意。在任何情况下,在用户空间应用程序中使用自旋锁的优点都是值得怀疑的。 Linux的互斥体实现(使用futexes)非常有效 - 特别是当锁是无争议的时,在设计良好的MT应用中几乎总是这样。

其他人指出send函数本身就是线程安全的。