1

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

发送一个UDP数据包是否被认为“足够小”以保证使用 a pthread_spin_lock,或者我仍然应该坚持使用pthread_mutex_lock

谢谢

4

3 回答 3

3

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

于 2013-02-02T22:23:41.867 回答
1

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

于 2013-02-02T22:19:49.613 回答
1

将系统调用包装在自旋锁中是一个坏主意。在任何情况下,在用户空间应用程序中使用自旋锁的优点都是值得怀疑的。Linux 的互斥锁实现(使用futexes)非常有效——尤其是当锁没有竞争时,在精心设计的 MT 应用程序中几乎总是如此。

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

于 2013-02-02T22:37:33.120 回答