【问题标题】:Linux socket using multiple threads to sendLinux socket使用多线程发送
【发布时间】:2012-06-28 01:39:57
【问题描述】:

我有一个非阻塞套接字将 udp 数据包发送到多个目标,并在同一个套接字上接收来自所有目标的响应。我正在一个专用线程中阅读,但写入 (sendto) 可以来自多个不同的线程。

这是一个没有任何额外同步的保险箱吗?我需要在持有互斥锁时写吗?或者,写入是否需要来自同一个线程并且我需要一个队列?

【问题讨论】:

标签: linux sockets pthreads


【解决方案1】:

内核将为您同步对底层文件描述符的访问,因此您不需要单独的互斥锁。如果您使用 TCP,这种方法会出现问题,但由于我们谈论的是 UDP,这应该是安全的,尽管不一定是最好的方法。

【讨论】:

  • @Nicolai 在这个应用程序中,有几个工作线程“感知”需要发送数据包。对您的评论感到好奇,认为这不一定是最好的方法 - 原因是什么?
  • 这一切都取决于手头的应用程序,但总的来说 udp 服务器使用非阻塞套接字迭代更容易和更清洁。
  • @NY UPTOWN:可以让来自不同线程的多个sendto()s 竞争,但您应该确保sendto() 不会与close() 竞争。
  • @caf 关于关闭的好点。逻辑是一些线程在初始化时启动,然后(使用条件变量)在关闭之前停止并加入。
【解决方案2】:

您可以从单个或多个线程写入套接字。如果您从多个线程写入套接字,它们应该与互斥锁同步。相反,如果您的线程将它们的消息放在队列中,并且单个线程从队列中拉出进行写入,则对队列的读写应该受到互斥锁的保护。

从不同线程读取和写入同一个套接字不会相互干扰。

【讨论】:

  • 互斥锁确实会序列化请求,但不同之处在于写入来自不同的线程,而不是具有生产者/消费者样式队列的同一线程。
猜你喜欢
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2012-02-18
  • 2012-12-14
  • 2013-04-18
  • 2017-04-29
  • 1970-01-01
相关资源
最近更新 更多