应用提升::asio
Application of boost::asio
void ahaConnector::asyncWriteData(vector<uint8_t> packedMessage) {
cout<<"n async write data packed messagbace";
deviceStreamDescriptor.assign(device);
boost::asio::write (
deviceStreamDescriptor,
boost::asio::buffer(packedMessage)
);
readbuffer.resize(1024);
deviceStreamDescriptor.async_read_some(boost::asio::buffer(readbuffer),
boost::bind(&ahaConnector::readHeader, this,
boost::asio::placeholders::error(),
boost::asio::placeholders::bytes_transferred()
));
io_service.run();
}
void ahaConnector::readHeader(const boost::system::error_code &ec, std::size_t bytes_transferred) {
if(!ec) {
std::cout<<"n Bytes transfereed :"<<bytes_transferred<<" "<<readbuffer.size();
cout<<endl;
vector<uint8_t> packedMessage;
packedMessage.resize(bytes_transferred);
packedMessage = readbuffer;
deviceStreamDescriptor.async_read_some(boost::asio::buffer(readbuffer),
boost::bind(&ahaConnector::readHeader, this,
boost::asio::placeholders::error(),
boost::asio::placeholders::bytes_transferred()
));
}
else {
cout<<"n System Error Code "<<ec;
}
}
我已经在单个线程上使用 boost::asio 成功执行了异步 I/O,这实际上不提供服务。
- 我的主线程对设备文件执行异步写入
- 我想要一个读取器的线程(应用程序的生命周期(,提供对同一线程中读取处理程序的回调
- 现在我需要以某种方式通知第三个线程"回调线程"阅读器线程已收到数据。
我尝试使用不同的文件描述符为阅读器和编写器创建单独的线程,它不起作用,我认为缺乏同步。
我想要一个单独的io_service线程,每次 asyncwriteData 将一些数据推送到io_service线程时io_service线程都会再次重用该线程,并且线程会将一些数据推送到回调线程上。
PS :我已经看到了足够的解决方案,但我想要一个贯穿应用程序生命周期的io_service线程
我面临的挑战:
- 创建一个最初处于空闲状态的全局线程,并将工作分配给它们。
- 我应该有一个阅读器编写器线程还是一个用于io_service的单个线程
只需使用
-
使用不同的线程分隔
io_service
,用于写入线程、读取线程和回调线程 -
或者使用具有线程池和三个
strand
的单个io_service
实例
第一个为您的任务提供"线程相关性"。第二个减少了所需的锁定,并提供了潜在的更好的可扩展性。
观察:
- 您是否使用信号无关紧要(AFAIK 它不执行特定于线程的回调调用(
-
io_service
对象是完全线程安全的,因此您可以完美地将它们用作任务队列 -
strands
是逻辑线程,因为它们序列化链上的工作,而不必在同一线程上运行单个任务 - 下面是使用线程队列将 Asio 与回调到后台线程一起使用的演示:用于deadline_timers的非阻塞提升io_service
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 提升 ASIO 无法识别计时器对象
- 试图在visual studio上用C++创建一个桌面应用程序
- boost::asio::io_service 在线程中,不会在应用程序退出时退出
- 将 std::bind 应用于带有参数 <boost::asio::ip::tcp::socket> 时出错?
- 将超时到udp call recere_从ASIO中应用
- Boost.Asio:由于线程退出或应用程序请求,I/O 操作已中止
- 使用无效套接字调用boost::asio::write()使我的Blackberry 10应用程序崩溃
- 如何将boost.asio添加到windows通用应用程序项目中
- 在boost :: asio应用程序的示例中,我如何重置send_break
- 在 ipv6 链接范围单播 udp 客户端-服务器中应用 boost::asio::ip::udp,有时有效,但有时无效
- boost::asio 中的未经请求的消息使应用程序崩溃,没有 SSL 它可以正常工作,为什么
- 在 WXWIDGET 应用程序中使用 boost ASIO 编译错误
- 应用提升::asio
- Boost.Asio应用程序在创建接收器对象时抛出异常
- 同一网络中两台计算机之间的客户端-服务器应用程序(使用boost::asio)
- 如何在用c++编写的应用程序中指定要使用的特定NIC(boost asio)
- 如何将使用boost::asio的本地c++静态库导入CLI/ c++混合模式应用程序?
- 如何将此Boost ASIO示例应用于我的应用程序
- boost.asio :多端口应用层协议