相关疑难解决方法(0)

libuv与Boost/ASIO相比如何?

我会对以下方面感兴趣:

  • 范围/功能
  • 性能
  • 到期

c++ boost boost-asio libuv

221
推荐指数
3
解决办法
5万
查看次数

如何在C++中使用boost创建线程池?

如何使用C++中的boost创建线程池,如何将任务分配给线程池?

c++ boost boost-thread boost-asio threadpool

51
推荐指数
3
解决办法
6万
查看次数

在C++ 11中实现一个简单的通用线程池

我想创建一个用于实验目的的线程池(以及有趣的因素).它应该能够处理各种各样的任务(所以我可以在以后的项目中使用它).


在我的线程池类中,我将需要某种任务队列.由于标准库std::packaged_task从C++ 11标准开始提供,我的队列看起来像std::deque<std::packaged_task<?()> > task_queue,所以客户端可以std::packaged_task通过某种公共接口函数将s 推入队列(然后池中的一个线程将通知一个条件变量来执行它,等等.


我的问题与std::packaged_task<?()>deque中s 的模板参数有关.

函数签名?()应该能够处理任何类型/数量的参数,因为客户端可以执行以下操作:

std::packaged_task<int()> t(std::bind(factorial, 342)); thread_pool.add_task(t);

所以我不必处理参数的类型/数量.

但是回报价值应该是多少?(因此问号)

  • 如果我将整个线程池类作为模板类,它的一个实例将只能处理具有特定签名的任务(如std::packaged_task<int()>).

    我希望一个线程池对象能够处理任何类型的任务.

  • 如果我使用std::packaged_task<void()>并且调用的函数返回一个整数,或者任何东西,那么这就是未定义的行为.

c++ multithreading packaged-task c++11 stdthread

5
推荐指数
1
解决办法
4868
查看次数

boost asio处理程序中的长时间运行/阻塞操作

现在的情况

我使用boost.asio实现了一个TCP服务器,它目前使用一个io_service对象,我run从单个线程调用该方法.

到目前为止,服务器能够立即回应客户端的请求,因为它在内存中具有所有必要的信息(接收处理程序中不需要长时间运行的操作).

问题

现在需求已经改变,我需要从数据库(使用ODBC)中获取一些信息 - 这基本上是一个长期运行的阻塞操作 - 以便为客户端创建响应.

我看到了几种方法,但我不知道哪种方法最好(可能还有更多方法):

第一种方法

我可以在处理程序中保持长时间运行的操作,只需io_service.run()从多个线程调用即可.我想我会使用尽可能多的线程,因为我有可用的CPU内核?

虽然这种方法很容易实现,但我不认为我会用这种方法获得最佳性能,因为线程数量有限(大部分时间都是空闲的,因为数据库访问更多是I/O绑定操作而不是计算绑定操作).

第二种方法

本文件的第6部分中,它说:

将线程用于长时间运行的任务

作为单线程设计的一种变体,该设计仍然使用单个io_service :: run()线程来实现协议逻辑.长时间运行或阻塞任务被传递给后台线程,一旦完成,结果将被发布回io_service :: run()线程.

这听起来很有希望,但我不知道如何实现它.任何人都可以为这种方法提供一些代码片段/示例吗?

第三种方法

BorisSchäling在其7.5节中介绍了如何使用自定义服务扩展boost.asio.

这看起来很多工作.与其他方法相比,这种方法有什么好处吗?

multithreading client-server boost-asio

4
推荐指数
1
解决办法
3074
查看次数

boost :: system :: error_code :: message()使用boost :: asio socket抛出访问冲突异常

我正在实现一个客户端应用程序,它必须与硬件设备建立少量套接字连接.我已将问题分解为以下小代码子集

boost::system::error_code ec;
std::string str_message = ec.message();  // no access violation before connect()
std::string str_port = "502";
std::string str_ip = "192.168.12.198";

boost::asio::io_service io_service;
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(),str_ip,str_port);
boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
boost::asio::ip::tcp::socket s(io_service);

ec = s.connect(*iterator,ec);
if (ec)
{
    // connection error of some kind.
    std::string str_debug = ec.message();  // BANG!!!!

}
Run Code Online (Sandbox Code Playgroud)

我正在使用Embarcadero RAD studio XE4 C++ Builder,当我在主VCL线程中运行上面的代码时,它运行正常.当我和多个连接运行它,我上面的代码中的多个实例运行TThread类,这是当我进入访问冲突的问题-它似乎是,当error_code被修改的connect电话,该内部构件m_cat中的error_code实例变为NULL,所以当我打电话时,message()我得到访问冲突.即使我只运行一个后台线程,也会发生这种情况.

上面的代码是否有可能在我需要使用它的方式上不是线程安全的?我试图找出为什么这个代码不会在后台线程中运行,但找不到任何关于它的东西.

我运行的升级版本是1.50,因为这是用于在RAD studio中构建64位应用程序的集成版本.

是否有其他人在多线程设置(Embarcadero或其他)中遇到此问题,如果是这样,你是如何解决它的?或者这个类是不安全的以多线程方式使用?

c++ multithreading boost-asio c++builder-xe4

4
推荐指数
2
解决办法
4421
查看次数