应用提升::asio

Application of boost::asio

本文关键字:asio 应用      更新时间:2023-10-16
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,这实际上不提供服务。

  1. 我的主线程对设备文件执行异步写入
  2. 我想要一个读取器的线程(应用程序的生命周期(,提供对同一线程中读取处理程序的回调
  3. 现在我需要以某种方式通知第三个线程"回调线程"阅读器线程已收到数据。

我尝试使用不同的文件描述符为阅读器和编写器创建单独的线程,它不起作用,我认为缺乏同步。

我想要一个单独的io_service线程,每次 asyncwriteData 将一些数据推送到io_service线程时io_service线程都会再次重用该线程,并且线程会将一些数据推送到回调线程上。

PS :我已经看到了足够的解决方案,但我想要一个贯穿应用程序生命周期的io_service线程

我面临的挑战:

  1. 创建一个最初处于空闲状态的全局线程,并将工作分配给它们。
  2. 我应该有一个阅读器编写器线程还是一个用于io_service的单个线程

只需使用

  1. 使用不同的线程分隔io_service,用于写入线程、读取线程和回调线程

  2. 或者使用具有线程池和三个strand的单个 io_service 实例

第一个为您的任务提供"线程相关性"。第二个减少了所需的锁定,并提供了潜在的更好的可扩展性。

观察:

  • 您是否使用信号无关紧要(AFAIK 它不执行特定于线程的回调调用(
  • io_service对象是完全线程安全的,因此您可以完美地将它们用作任务队列
  • strands逻辑线程,因为它们序列化链上的工作,而不必在同一线程上运行单个任务
  • 下面是使用线程队列将 Asio 与回调到后台线程一起使用的演示:用于deadline_timers的非阻塞提升io_service