【问题标题】:C++ shared_ptr and direct buffer enqueueing. How?C++ shared_ptr 和直接缓冲区入队。如何?
【发布时间】:2015-05-15 22:22:58
【问题描述】:

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

  • 使用参数调用入队函数:

    enqueue(obj_ptr item)
    

    其中 obj_ptr 是指向使用 shared_ptr 创建的类 obj 的指针。然后,给定的项目(类型 obj_ptr)在标准列表中排队

    list<obj_ptr>
    

    然后简单地使用 front() 和 pop_front() 出列并进一步发送。在这个实现中一切正常。

  • 我想做的是:

    使用其 API 将这些项目排入特殊列表:

    a_enqueue(void *buffer)
    

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

我正在考虑使用:

    item->get()

返回类型 obj 但是我只能出列 obj,而不是 obj_ptr 出列后的下一个操作(+ 我会关于类引用的松散信息,它会破坏多线程应用程序)

我正在考虑提供指向 obj_ref 项的列表指针

    a_enqueue(&item)

但是 item 是很久以前在某个函数中创建的,并且多次作为参数(而不是指针)放置,并且无法找到它的直接地址。

对我来说最好的方法是将缓冲区 obj (item->get()) 入队,然后出队并以某种方式找到我在 get 中使用的相同引用 obj_ptr item ()。可能吗?还有其他想法吗?

谢谢。

编辑:出队调用是:

 a_dequeue(void **buffer)

【问题讨论】:

  • 为什么要将原始指针加入队列?
  • 关于队列的API

标签: c++ multithreading shared-ptr


【解决方案1】:

API 出队是什么样的?

通常,如果您在排队 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 * 传递的任何其他对象相同。

【讨论】:

  • a_enqueue(void ), a_dequeue(void) 仅。你说我可以把 obj_ptr 和其他对象一样对待?是否有类似 a_enqueue(cast item) 的解决方案,其中 item 的类型为 obj_ptr = shared_ptr
  • 请将a_dequeue的标头声明添加到问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多