如何检查c中是否正在使用套接字,以在单个套接字上执行多个同时写入

时间:2014-07-06 10:55:58

标签: c multithreading sockets tcp

我尝试使用TCP连接写入和读取套接字。许多工作者写入同一个套接字。但他们不能同时写作。所以其中一个人每次都可以写,剩下的就等了。我怎么知道插槽中是否有东西写入?有没有系统调用。提前谢谢!

3 个答案:

答案 0 :(得分:1)

如果你想要高性能,你应该做的是拥有一个管理套接字的线程,并使用内存中的队列将数据从worker发布到套接字管理器。这可以在没有太多麻烦的情况下无锁地完成,并且如果您的工作人员可以咀嚼其他任务而不是等待轮到他们使用套接字,则可以提高吞吐量。

一个可能有趣的替代方法是使用UDP而不是TCP。然后发送者可能根本不需要同步,因为它是面向消息的(即如果消息足够短,则消息不会被部分发送)。您甚至可以使用多个套接字写入相同的UDP地址。但尝试这一点需要非常小心并考虑到另一端的阅读内容。

答案 1 :(得分:0)

如果您可以在一个send()sendmsg()中发送所有内容,那么您所要求的内容甚至是不必要的。这些调用(a)是原子的,(b)在阻塞模式下将所有数据从应用程序传输到内核之前不会返回。

答案 2 :(得分:-1)

可以同时使用TCP / UDP套接字(并行线程)进行读写操作。这意味着在一个线程中读取操作,在另一个线程中写入操作。但是同时在一个线程上执行相同的操作(读取或写入)不适用。这意味着在单个套接字上执行写(或读)操作的多个线程在没有任何套接字锁定的情况下是线程安全的。

因此,如果您希望多个worker同时在单个套接字上写入,则意味着您需要为每个worker创建线程,并且需要在进行写入操作之前锁定套接字。这需要n个线程用于n个工作者。