【发布时间】:2014-06-16 11:58:37
【问题描述】:
这是一个一般性的问题 - 但是我已经多次遇到这个问题,但我仍然没有找到最好的解决方案。
假设您有一个多线程程序(例如 HTTP 应用程序服务器)并通过套接字(TCP、Unix、...)进行通信。主线程使用异步 IO 和 select() 或 poll() POSIX 调用来调度来自/到套接字的流量。还有一些工作线程处理请求并提供响应。为了将响应发送回客户端,工作线程“以某种方式”与主线程(轮询)同步。问题的核心是“如何”——就什么是有效的而言。我可以使用 pipe() - 基于套接字的 IPC 机制 - 但这在我看来是相当大的开销。我倾向于使用一些 pthread IPC 技术,如互斥锁、条件变量等……但这些不适用于 select() 或 poll()。
在 POSIX(及周边环境)中是否有解决此冲突的通用技术? 我猜在 Windows 上有 WaitForMultipleObjects() 函数允许这样做。
示例程序旨在说明一个问题,我知道我可以以不同的方式设计主/从模式,但这不是我想要的。我在其他情况下也有同样的情况。
【问题讨论】:
-
你能扩展一下 “这些不适用于 select()” 吗?他们在哪些方面不与 select 和friend 合作?
-
"这些不适用于 select()" - 您不能以与套接字相同的方式(相同的调用)在互斥锁上“选择”或“轮询”,如果它必须选择相应的一个线程将等待套接字上的互斥锁/条件或事件。
-
那是错误的思考方式;
select不应该关心你是否使用线程。 -
这与线程无关,主要与 pthread IPC 相关——例如互斥体和条件变量。
标签: c multithreading sockets posix