Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 带套接字多路复用的c tcp服务器:使用select时锁定读写器集?_Multithreading_Select_Tcp - Fatal编程技术网

Multithreading 带套接字多路复用的c tcp服务器:使用select时锁定读写器集?

Multithreading 带套接字多路复用的c tcp服务器:使用select时锁定读写器集?,multithreading,select,tcp,Multithreading,Select,Tcp,我的服务器使用非阻塞套接字多路复用。 我想使用一个线程来接收传入连接并处理输入,另一个线程通过套接字发送数据。看起来是这样的: reader_worker(...) { ... select(fd_max+1, &read_set, NULL, NULL, NULL); ... } writer_worker(...) { ... select(fd_max+1, NULL, &write_set, NULL, NULL); ..

我的服务器使用非阻塞套接字多路复用。 我想使用一个线程来接收传入连接并处理输入,另一个线程通过套接字发送数据。看起来是这样的:

reader_worker(...)
{
    ...
    select(fd_max+1, &read_set, NULL, NULL, NULL);
    ...
}

writer_worker(...)
{
    ...
    select(fd_max+1, NULL, &write_set, NULL, NULL);
    ...
}

因为我不想错过传入的连接,所以我可以想象在不同的线程中接收和发送更好。我是否必须锁定可能在读\u集中和写\u集中的套接字?这是正确的方法还是这种方法没有任何性能改进?

如果在一个线程中执行,您不会错过任何传入连接。即使要发送或接收大量数据,send()或recv()调用的延迟也由网络堆栈中本地缓冲区的大小决定,因此您将很快返回以接受传入连接

但有两件事我不确定您的代码示例:

  • 将用于接受连接的套接字放入与用于单个select()调用的已接受连接相同的数组中。除非绑定到不同的网络接口,否则使用多个线程不会使程序运行得更快
  • 如果您正在处理传入的数据,这就是第二个线程变得有用的地方。一般来说,您拥有网络接口卡、CPU、硬盘等资源。每个资源有一个线程很有用,即一个线程处理网络IO(接收请求、发送响应),另一个线程处理实际请求。如果您有多个内核,还可以使用多个线程来处理请求,前提是这是一个CPU受限的任务。如果所有这些请求都是从一个硬盘提供图片,那么使用多个线程进行请求不会给您带来任何额外的性能

在询问性能问题时,您应该真正从分析入手。在担心复制它以减少延迟之前,我会尝试将
select
完全去掉。如果您有一个足够大的侦听待办事项,可以将您保留到循环的下一个迭代(这应该非常快,因为您的读写量没有超出缓冲区的容量),那么您就不会错过连接。