serial_port::async_read_some函数调用过程

serial_port::async_read_some函数调用过程

False
True
serial_port::async_read_some
serial_port_service::async_read_some
reactive_descriptor_service::async_read_some
reactive_descriptor_service::start_op
noop ?
epoll_reactor::start_op
epoll_reactor::post_immediate_completion
task_io_service::post_immediate_completion
  • 其中noop 实质就是reactive_descriptor_service::start_op()函数最后一个参数,就是传参buffer是否为空,
  • task_io_service::post_immediate_completion()本质是往任务队列push一个任务,io_service线程从任务队列中取出任务,执行任务相关操作

reactive_descriptor_service::start_op函数定义

reactive_descriptor_service::start_op(impl, reactor::read_op, p.p, true,
        buffer_sequence_adapter<boost::asio::mutable_buffer,
          MutableBufferSequence>::all_empty(buffers) 
          )

reactive_descriptor_service::start_op函数实现

void reactive_descriptor_service::start_op(
    reactive_descriptor_service::implementation_type& impl,
    int op_type, reactor_op* op, bool is_non_blocking, bool noop)
{
  if (!noop)
  {
    if ((impl.state_ & descriptor_ops::non_blocking) ||
        descriptor_ops::set_internal_non_blocking(
          impl.descriptor_, impl.state_, true, op->ec_))
    {
      reactor_.start_op(op_type, impl.descriptor_,
          impl.reactor_data_, op, is_non_blocking);
      return;
    }
  }

  reactor_.post_immediate_completion(op);
}

epoll_reactor::start_op函数实现

void epoll_reactor::start_op(int op_type, socket_type descriptor,
    epoll_reactor::per_descriptor_data& descriptor_data,
    reactor_op* op, bool allow_speculative)
{
  if (!descriptor_data)
  {
    op->ec_ = boost::asio::error::bad_descriptor;
    post_immediate_completion(op);
    return;
  }

  mutex::scoped_lock descriptor_lock(descriptor_data->mutex_);

  if (descriptor_data->shutdown_)
  {
    post_immediate_completion(op);
    return;
  }

  if (descriptor_data->op_queue_[op_type].empty())
  {
    if (allow_speculative
        && (op_type != read_op
          || descriptor_data->op_queue_[except_op].empty()))
    {
      if (op->perform())
      {
        descriptor_lock.unlock();
        io_service_.post_immediate_completion(op);
        return;
      }

      if (op_type == write_op)
      {
        if ((descriptor_data->registered_events_ & EPOLLOUT) == 0)
        {
          epoll_event ev = { 0, { 0 } };
          ev.events = descriptor_data->registered_events_ | EPOLLOUT;
          ev.data.ptr = descriptor_data;
          if (epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev) == 0)
          {
            descriptor_data->registered_events_ |= ev.events;
          }
          else
          {
            op->ec_ = boost::system::error_code(errno,
                boost::asio::error::get_system_category());
            io_service_.post_immediate_completion(op);
            return;
          }
        }
      }
    }
    else
    {
      if (op_type == write_op)
      {
        descriptor_data->registered_events_ |= EPOLLOUT;
      }

      epoll_event ev = { 0, { 0 } };
      ev.events = descriptor_data->registered_events_;
      ev.data.ptr = descriptor_data;
      epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev);
    }
  }

  descriptor_data->op_queue_[op_type].push(op);
  io_service_.work_started();
}

task_io_service::post_immediate_completion函数实现

void task_io_service::post_immediate_completion(task_io_service::operation* op)
{
#if defined(BOOST_HAS_THREADS) && !defined(BOOST_ASIO_DISABLE_THREADS)
  if (one_thread_)
  {
    if (thread_info* this_thread = thread_call_stack::contains(this))
    {
      ++this_thread->private_outstanding_work;
      this_thread->private_op_queue.push(op);
      return;
    }
  }
#endif // defined(BOOST_HAS_THREADS) && !defined(BOOST_ASIO_DISABLE_THREADS)

  work_started();
  mutex::scoped_lock lock(mutex_);
  op_queue_.push(op);
  wake_one_thread_and_unlock(lock);
}
`cuda::memcpy_async` 和 `cooperative_groups::memcpy_async` 都是异步的内存拷贝函数,但是它们的使用场景和特点略有不同。 `cuda::memcpy_async` 是 CUDA Runtime API 中提供的异步内存拷贝函数,它可以在主机和设备之间进行数据拷贝,并且可以在拷贝过程中执行其他的 CUDA 操作。这个函数的使用方法和 `cudaMemcpy` 类似,但是需要额外传入一个 `cudaStream_t` 参数来指定使用的 CUDA 流。与 `cudaMemcpy` 不同的是,`cuda::memcpy_async` 不会阻塞主机线程,而是立即返回并在后台执行数据拷贝。因此,它可以提高程序的并发性能,特别是在数据量较大的情况下。 `cooperative_groups::memcpy_async` 是 CUDA cooperative groups 库中提供的异步内存拷贝函数,它是在协作线程组(cooperative thread groups)中进行的数据拷贝。与 `cuda::memcpy_async` 不同的是,这个函数只能在协作线程组中使用,而且需要传入一个 `cooperative_groups::coalesced_group` 参数来指定线程组。由于协作线程组中的线程可以协同工作,因此这种方式可以进一步提高内存拷贝的效率。 综上所述,`cuda::memcpy_async` 和 `cooperative_groups::memcpy_async` 都是异步内存拷贝函数,但是使用场景和特点略有不同。`cuda::memcpy_async` 可以在主机和设备之间进行数据拷贝,并且可以在拷贝过程中执行其他的 CUDA 操作;而 `cooperative_groups::memcpy_async` 则是在协作线程组中进行的数据拷贝,可以进一步提高内存拷贝的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值