2012-06-26 31 views
3

我有一个单一的非阻塞套接字发送udp数据包给多个目标,并在同一套接字上接收来自所有这些目标的响应。我正在专用线程中读取,但写入(sendto)可能来自多个不同的线程。使用多线程发送的Linux套接字

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

+0

可能的重复:http://stackoverflow.com/questions/1981372/are-parallel-calls-to-send-recv-on-the-same-socket-valid – Casper

+0

这里也是关于这个主题的讨论:https: //groups.google.com/forum/?fromgroups#!topic/comp.os.linux.networking/cLbMGRNw8EA – Casper

+0

@Casper链接到谷歌组的良好链接 –

回答

6

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

+0

@Nicolai在这个应用程序中有几个工作线程“感知”需要发送一个数据包。好奇你的评论,这不一定是最好的方式 - 这是什么原因? –

+0

这一切都取决于手头的应用程序,但通常udp服务器更容易和更干净地完成*迭代*使用非阻塞套接字。 –

+1

@NY UPTOWN:可以从不同的线程竞争多个sendto()s,但是你应该确保'sendto()'不与'close()'竞争。 – caf

-1

您可以从单个或多个线程写入套接字。如果你从多个线程写入套接字,它们应该与一个互斥体同步。相反,如果您的线程将其消息放入队列中,并且单个线程从队列中拉出来执行写操作,则对队列的读写操作应该受互斥量的保护。

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

+0

的确,互斥体将序列化请求,但区别在于写入会来自不同的线程与生产者/消费者风格队列相同的线程。 –

+0

对。我更新了我的答案,以便更清楚。 –