Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.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

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
Pthread服务器编程:如何释放在recv调用中被阻塞的线程,以处理来自另一个线程的请求_C_Multithreading_Pthreads_Recv - Fatal编程技术网

Pthread服务器编程:如何释放在recv调用中被阻塞的线程,以处理来自另一个线程的请求

Pthread服务器编程:如何释放在recv调用中被阻塞的线程,以处理来自另一个线程的请求,c,multithreading,pthreads,recv,C,Multithreading,Pthreads,Recv,我有一个简单的服务器程序,使用pthread库在Debian上用C编写。 该程序处理一些希望共享文件的客户端之间的通信。对于每个客户端,都有一个处理程序线程。 现在,在某个时刻,每个线程都会阻塞recv(),等待任何客户端文件请求。如果其中一个客户机请求另一个客户机拥有的特定文件,服务器必须通过其处理程序线程从其所有者处获取该文件,然后通过其处理程序线程将该文件传递给请求该文件的客户机。 由于所有线程都被recv()调用阻塞,其他线程如何注意到它们必须向正在处理的客户端请求文件? 有没有办法“中

我有一个简单的服务器程序,使用pthread库在Debian上用C编写。 该程序处理一些希望共享文件的客户端之间的通信。对于每个客户端,都有一个处理程序线程。 现在,在某个时刻,每个线程都会阻塞recv(),等待任何客户端文件请求。如果其中一个客户机请求另一个客户机拥有的特定文件,服务器必须通过其处理程序线程从其所有者处获取该文件,然后通过其处理程序线程将该文件传递给请求该文件的客户机。 由于所有线程都被recv()调用阻塞,其他线程如何注意到它们必须向正在处理的客户端请求文件?
有没有办法“中断”recv(),提供请求,然后返回recv()?

执行此操作的经典方法是为每个线程创建一个
管道()
,而不是阻塞
recv()
调用,线程在
poll()中阻塞
监视管道的套接字和读取端文件描述符。当
poll()
返回时,如果套接字可读,则调用
recv()
;如果管道是可读的,那么从中读取并检查来自其他线程的请求


当您想要向另一个线程发出请求时,您可以通过写入该线程的管道来唤醒它。

具有非阻塞套接字,并使用
选择
/
轮询
?不幸的是,项目要求之一是线程必须在recv上阻塞。是否可以使用信号SIGUSR1中断阻塞recv?混合线程和信号的棘手部分是确保信号发送到正确的线程。非阻塞recv()是一个更好的解决方案,因为select()中阻塞的线程可以通过在另一个套接字上发送一个字节来彻底唤醒。也就是说,如果您必须尝试信号路由,请参见以下内容:如果使用select,您可以通过各种方式中断recv()块。例如,通过添加超时,在一段时间后中断recv(),例如,通过在选择中包含管道。。写入管道,线程就会解锁。看“是否可能使用信号SIGUSR1中断阻塞recv”是。为此使用
pthread\u kill()