Linux socket使用多线程发送
Posted
技术标签:
【中文标题】Linux socket使用多线程发送【英文标题】:Linux socket using multiple threads to send 【发布时间】:2012-06-26 17:03:01 【问题描述】:我有一个非阻塞套接字将 udp 数据包发送到多个目标,并在同一个套接字上接收来自所有目标的响应。我正在一个专用线程中阅读,但写入 (sendto) 可以来自多个不同的线程。
这是一个没有任何额外同步的保险箱吗?我需要在持有互斥锁时写吗?或者,写入是否需要来自同一个线程并且我需要一个队列?
【问题讨论】:
可能重复:***.com/questions/1981372/… 这里还有一个话题讨论:groups.google.com/forum/?fromgroups#!topic/… @Casper 谷歌群组的好链接 【参考方案1】:内核将为您同步对底层文件描述符的访问,因此您不需要单独的互斥锁。如果您使用 TCP,这种方法会出现问题,但由于我们谈论的是 UDP,这应该是安全的,尽管不一定是最好的方法。
【讨论】:
@Nicolai 在这个应用程序中,有几个工作线程“感知”需要发送数据包。对您的评论感到好奇,认为这不一定是最好的方法 - 原因是什么? 这一切都取决于手头的应用程序,但总的来说 udp 服务器使用非阻塞套接字迭代更容易和更清洁。 @NY UPTOWN:可以让来自不同线程的多个sendto()s
竞争,但您应该确保sendto()
不会与close()
竞争。
@caf 关于关闭的好点。逻辑是一些线程在初始化时启动,然后(使用条件变量)在关闭之前停止并加入。【参考方案2】:
您可以从单个或多个线程写入套接字。如果您从多个线程写入套接字,它们应该与互斥锁同步。相反,如果您的线程将它们的消息放在队列中,并且单个线程从队列中拉出进行写入,则对队列的读写应该受到互斥锁的保护。
从不同线程读取和写入同一个套接字不会相互干扰。
【讨论】:
互斥锁确实会序列化请求,但不同之处在于写入来自不同的线程,而不是具有生产者/消费者样式队列的同一线程。以上是关于Linux socket使用多线程发送的主要内容,如果未能解决你的问题,请参考以下文章