在我的Linux应用程序中,我有两个线程都尝试使用相同的UDP
客户端套接字发送UDP
广播数据包(大约50-500字节)。他们大约每2-3秒做一次。在这种情况下,围绕“send(...)”子句,我可以放置pthread_mutex_lock
或pthread_spin_lock
。理论上说,如果它是一个非常小的操作,pthread_spin_lock
更有效(尽管在很短的时间内CPU消耗很高)。但如果它的操作更大,那么pthread_mutex_lock
会更好。
发送一个UDP
数据包被认为是“足够小”以保证使用pthread_spin_lock
,还是应该坚持使用pthread_mutex_lock
?
谢谢
答案 0 :(得分:3)
如果只需要锁定是因为它们都在同一个套接字上发送,那么就根本不需要锁定 - 两个线程同时在同一个UDP套接字上调用send()
是可以接受的时间。发送的数据不会交错。
答案 1 :(得分:1)
使用自旋锁而不是互斥锁可以避免在遇到拥塞时进入系统调用。如果您在关键部分使用网络层,无论如何您将进入系统调用。所以据我所知,使用自旋锁在这里没有多大意义。
答案 2 :(得分:1)
用螺旋锁包装系统调用是一个坏主意。在任何情况下,在用户空间应用程序中使用自旋锁的优点都是值得怀疑的。 Linux的互斥体实现(使用futexes)非常有效 - 特别是当锁是无争议的时,在设计良好的MT应用中几乎总是这样。
其他人指出send
函数本身就是线程安全的。