我想创建一个简单的线程池(在*nix系统上)来处理异步通信服务器上的输入。我有几个问题。首先,我只想要一个静态的线程数,任意设置为6。
我应该如何将命令发送到工作线程?
我正在考虑使用简单的套接字通信,如下所示
主线程::发送(接收)套接字(发送) otherSocket;
然后让我的线程简单地阻塞在接收调用上,这是不是非常低效?
有没有我应该用的库?有没有更好的实现方法?
(稍后我将使线程动态化,我只是想从一个固定的数字开始会更容易一些)
发布于 2011-03-31 02:33:39
首先,您应该认识到Windows内置的不只是一个线程池API,而是两个线程池API。如果这还不够,I/O完成端口基本上也是变相的线程池。因此,可能根本没有太多理由去编写自己的线程池。
除非您计划允许线程在不同的机器上运行,否则我不会使用套接字进行通信。线程的正常意图是它们应该将开销保持在最小;套接字不能很好地适应这一点。如果您正在跨越机器边界,那么更多的开销(网络通信)几乎是不可避免的,在这种情况下,使用套接字而不是其他一些网络API并没有太大的不同。还要注意,对于跨机器工作,通常需要做更多的工作,将数据从一个机器编组到另一个机器,等等。
假设您坚持使用一台机器,我将使用某种线程安全队列而不是套接字。我在previous answer中发布了一个,您可能会发现有用。其中包括一些示例代码,这些代码创建一个线程池来服务队列中的任务。
发布于 2011-03-31 02:46:35
有没有你应该使用的库?可以肯定的是,否则您将无法在标准C++中实现任何您想要的功能。这就引出了你想要使用什么平台的问题。您使用的是Windows,还是某种风格的Linux?如果你使用的是Windows,你可以使用Windows线程和Winsocks2。如果是Linux,你可以尝试Posix线程,至于网络,我不太确定。但是,您可以只使用Boost库来完成所有这些工作,而且它应该可以在Windows和Linux操作系统上运行。
就发送消息而言,您可以为您的消息队列使用互斥锁,只需简单地使用一个接收消息函数来锁定它并添加消息,该函数既适用于来自任何线程上套接字的网络传入消息,也适用于想要将消息发送到该线程的其他线程。另外,不要忘记,当线程处理消息时,您还希望锁定互斥锁;每当您访问该消息队列时,都需要将其锁定以防止冲突/数据错误。
发布于 2011-03-31 03:32:57
由于您使用的是套接字,因此您必须使用select或poll之类的命令来等待套接字活动。因此,对于线程间通信(Itc),使用文件描述符的东西将非常有用。这可能是一对或管道或unix域套接字。
然后,您将让您的主线程接受新的连接,并使用您的itc机制将新的文件描述符传递给工作线程。工作线程随后会将新的文件描述符添加到选择/轮询循环中。
如果您正在连接并等待后端服务器(如数据库),您可能会在等待recv完成时决定阻塞,尽管您可能应该避免这样做。如果您使用状态机并将堆栈回滚到select外观(在将后端文件描述符添加到select/poll循环之后),您的服务器将具有更好的响应能力。这将使你的主线程更容易控制你的辅助线程。如果您很聪明,那么您的线程可能能够一次处理多个请求,并且只需少量线程,您就应该拥有一个可伸缩的服务器。
尽量避免对itc使用信号量或互斥锁,而是通过您的itc管道或unix域套接字发送所有请求。在比赛条件下,你可以省去很多心痛。
https://stackoverflow.com/questions/5490221
复制相似问题