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使用多线程发送的主要内容,如果未能解决你的问题,请参考以下文章

Python Socket接收/发送多线程

TCP socket 多线程 并发服务器(发送)与客户端(接收)

linux C语言 TCP 多线程 简易聊天室

socket如何用多线程实现同时能接收和发送消息

Linux系统与网络编程13:Socket多线程

多线程编程以及socket编程_Linux程序设计4chapter15