Pthread 服务器编程:如何释放在 recv 调用上阻塞的线程以处理来自另一个线程的请求
Pthread server programming: how to release a thread which is blocked on a recv call to handle a request from another thread
我有一个简单的服务器程序,使用 pthread 库在 Debian 上用 C 语言编写。
该程序处理一些想要共享文件的客户端之间的通信。对于每个客户端,都有一个处理程序线程。
现在,在某些时候,每个线程都会阻塞在 recv() 上等待任何客户端文件请求。如果其中一个客户端请求另一个客户端拥有的特定文件,则服务器必须通过其处理程序线程从其所有者处获取该文件,然后通过其处理程序线程将该文件传递给请求它的客户端。
由于所有线程都在 recv() 调用上被阻塞,其他线程如何注意到它们必须向它们正在处理的客户端请求文件?
有什么方法可以 "interrupt" recv(),服务请求然后返回到 recv()?
这样做的经典方法是为每个线程创建一个 pipe()
,而不是阻塞在 recv()
调用上,线程阻塞在 poll()
中监视两个套接字和管道的读取结束文件描述符。当poll()
returns时,如果套接字可读则调用recv()
;如果管道可读,则从中读取并检查来自其他线程的请求。
当你想向另一个线程发出请求时,你可以通过写入该线程的管道来唤醒它。
我有一个简单的服务器程序,使用 pthread 库在 Debian 上用 C 语言编写。 该程序处理一些想要共享文件的客户端之间的通信。对于每个客户端,都有一个处理程序线程。 现在,在某些时候,每个线程都会阻塞在 recv() 上等待任何客户端文件请求。如果其中一个客户端请求另一个客户端拥有的特定文件,则服务器必须通过其处理程序线程从其所有者处获取该文件,然后通过其处理程序线程将该文件传递给请求它的客户端。 由于所有线程都在 recv() 调用上被阻塞,其他线程如何注意到它们必须向它们正在处理的客户端请求文件? 有什么方法可以 "interrupt" recv(),服务请求然后返回到 recv()?
这样做的经典方法是为每个线程创建一个 pipe()
,而不是阻塞在 recv()
调用上,线程阻塞在 poll()
中监视两个套接字和管道的读取结束文件描述符。当poll()
returns时,如果套接字可读则调用recv()
;如果管道可读,则从中读取并检查来自其他线程的请求。
当你想向另一个线程发出请求时,你可以通过写入该线程的管道来唤醒它。