Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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
C++ 线程池实现_C++_Multithreading_Sockets_Asynchronous - Fatal编程技术网

C++ 线程池实现

C++ 线程池实现,c++,multithreading,sockets,asynchronous,C++,Multithreading,Sockets,Asynchronous,我想创建一个简单的线程池(在*nix系统上)来处理异步通信服务器上的输入。我有一些问题。首先我只想有一个静态的线程数,任意说6 我应该如何将命令发送到工作线程 我在考虑使用简单的套接字通信,比如 主线程::send[(recv)socket(send)otherSocket] 然后让我的线程简单地阻塞接收调用,这是不是非常低效 有我应该使用的图书馆吗?是否有更好的实施方法 (稍后我将使线程动态化,我只是觉得从一个设置的数字开始会更容易)首先,您应该意识到Windows内置的不仅仅是一个线程池AP

我想创建一个简单的线程池(在*nix系统上)来处理异步通信服务器上的输入。我有一些问题。首先我只想有一个静态的线程数,任意说6

我应该如何将命令发送到工作线程

我在考虑使用简单的套接字通信,比如

主线程::send[(recv)socket(send)otherSocket]

然后让我的线程简单地阻塞接收调用,这是不是非常低效

有我应该使用的图书馆吗?是否有更好的实施方法


(稍后我将使线程动态化,我只是觉得从一个设置的数字开始会更容易)

首先,您应该意识到Windows内置的不仅仅是一个线程池API,而是两个线程池API。如果这还不够,I/O完成端口基本上也是伪装的线程池。因此,可能根本没有太多理由编写自己的线程池

除非您计划允许线程在不同的机器上运行,否则我不会使用套接字进行通信。线程的一般意图是将开销保持在最小;插座不太适合那个。如果您正在跨越机器边界,那么更多的开销(网络通信)几乎是不可避免的,在这种情况下,使用套接字而不是其他一些网络API并没有多大区别。还要注意,对于跨机器工作,通常需要做更多的工作,将数据从一个编组到另一个编组,等等


假设您坚持使用一台机器,我会使用某种线程安全队列而不是套接字。我在一个网站上发布了一个,你可能会觉得有用。这包括一些创建线程池来为队列中的任务提供服务的示例代码。

首先,您应该意识到Windows内置的不仅仅是一个线程池API,而是两个线程池API。如果这还不够,I/O完成端口基本上也是伪装的线程池。因此,可能根本没有太多理由编写自己的线程池

除非您计划允许线程在不同的机器上运行,否则我不会使用套接字进行通信。线程的一般意图是将开销保持在最小;插座不太适合那个。如果您正在跨越机器边界,那么更多的开销(网络通信)几乎是不可避免的,在这种情况下,使用套接字而不是其他一些网络API并没有多大区别。还要注意,对于跨机器工作,通常需要做更多的工作,将数据从一个编组到另一个编组,等等


假设您坚持使用一台机器,我会使用某种线程安全队列而不是套接字。我在一个网站上发布了一个,你可能会觉得有用。这包括一些创建线程池以服务队列中的任务的示例代码。

是否有您应该使用的库?当然,否则你将无法在标准C++中完成任何你想要的。这就产生了你想使用什么平台的问题。。。你使用的是Windows还是Linux?如果您使用的是Windows,则可以使用Windows线程和Win Socks 2。如果Linux你可以尝试Posix线程,至于网络,我不太确定。但是,您可以使用Boost库来完成所有这些工作,它应该可以跨Windows和Linux操作系统工作


就发送消息而言,您可以为消息队列使用互斥锁,只需使用一个接收消息函数来锁定它并添加消息,该函数既适用于来自任何线程上套接字的网络传入消息,也适用于希望向该线程发送消息的其他线程。也不要忘记,当线程处理消息时,您还需要锁定互斥锁;无论何时访问该消息队列,都需要将其锁定以防止冲突/数据错误。

是否有您应该使用的库?当然,否则你将无法在标准C++中完成任何你想要的。这就产生了你想使用什么平台的问题。。。你使用的是Windows还是Linux?如果您使用的是Windows,则可以使用Windows线程和Win Socks 2。如果Linux你可以尝试Posix线程,至于网络,我不太确定。但是,您可以使用Boost库来完成所有这些工作,它应该可以跨Windows和Linux操作系统工作


就发送消息而言,您可以为消息队列使用互斥锁,只需使用一个接收消息函数来锁定它并添加消息,该函数既适用于来自任何线程上套接字的网络传入消息,也适用于希望向该线程发送消息的其他线程。也不要忘记,当线程处理消息时,您还需要锁定互斥锁;无论何时访问该消息队列,都需要将其锁定以防止冲突/数据错误。

由于您使用的是套接字,因此必须使用select或poll之类的命令来等待套接字活动。因此,对于线程间通信(itc),使用文件描述符的东西将非常有用。这可能是一对或多个管道或unix域套接字

然后,主线程将接受一个新的连接,并使用itc机制将新的文件描述符传递给工作线程。然后,工作线程将新的文件描述符添加到select/poll循环中

如果您正在连接并等待后端服务器(如数据库),您可能会在等待recv完成时决定阻塞,尽管您可能应该避免这种情况。如果使用状态机并将堆栈回滚到select外观(在将后端文件描述符添加到select/poll循环之后),服务器的响应速度会更快。这将使主线程更容易控制工作线程。如果你聪明,你会成功