C 共享_ptr和直接缓冲区入住.如何

C++ shared_ptr and direct buffer enqueueing. How?

本文关键字:缓冲区 如何 共享 ptr      更新时间:2023-10-16

我需要在多线程应用程序中进行小型代码重构我排队/排出操作。当前实施是:

  • 使用参数来调用:

    enqueue(obj_ptr item)
    

    其中 obj_ptr 是使用 sharone_ptr 创建的类 obj 的指针。然后,给定的项目(类型obj_ptr)在std列表中征集

    list<obj_ptr>
    

    并简单地使用front()和pop_front()脱水,然后发送。在此实施中一切都很好。

  • 我想做的是:

    使用其API进入特殊列表中的此项目:

    a_enqueue(void *buffer)
    

    所以我需要直接地址到缓冲区。

我正在考虑使用:

    item->get()

哪个返回类型 obj ,但是我只能脱离 obj ,而不是 obj_ptr ,它预计将在脱水后接下来操作( 我会有关类参考的宽松信息,它将破坏多线程应用程序)

我正在考虑提供列出指向 obj_ref项目的指针:

    a_enqueue(&item)

但是 item 很久以前就在某些功能中创建,并多次将参数(不是指针)放置,并且无法找到对其的直接地址。

对我来说,最好的方法是进入buffer obj (item-> get()),然后删除并以某种方式找到我在get中使用的相同参考 obj_ptr item ()。是否可以?还有其他想法吗?

谢谢。

编辑:Dequeue Call是:

 a_dequeue(void **buffer)

API Dequeue是什么样的?

通常,如果您要招募void *,则您也可以定义处理程序功能,以便您可以执行类似的操作...

void enqueue_ptr (obj_ptr enqueue_me)
{
  // Making a copy on the heap increments the ptr count
  obj_ptr * heap_ptr = new obj_ptr(enqueue_me);
  a_enqueue (heap_ptr);
}

obj_ptr dequeue_ptr (void)
{
  // You might need casting to change void * to obj_ptr *
  obj_ptr * heap_ptr;
  a_dequeue (&heap_ptr);
  // Sticking the copy in an auto_ptr decrements the ptr count when we leave scope.
  std::auto_ptr<obj_ptr> obj_pptr(heap_ptr);
  return *obj_pptr;
}

基本上,您将OBJ_PTR视为与其他任何其他对象相同的void *。