Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 将Concurrency::concurrent_queue与std::unique_ptr一起使用_Visual Studio 2010_Concurrency Runtime_Concurrent Queue - Fatal编程技术网

Visual studio 2010 将Concurrency::concurrent_queue与std::unique_ptr一起使用

Visual studio 2010 将Concurrency::concurrent_queue与std::unique_ptr一起使用,visual-studio-2010,concurrency-runtime,concurrent-queue,Visual Studio 2010,Concurrency Runtime,Concurrent Queue,我想使用VisualStudio2010的并发库在线程之间传递操作。 我有我的类SimpleAction,指向它的指针存储在Concurrency::concurrent\u队列中 使用此定义和“消费”逻辑,它可以工作: typedef Concurrency::concurrent_queue<SimpleAction *> ActionQueue; while (true) { SimpleAction *action = nullptr; while (m_

我想使用VisualStudio2010的并发库在线程之间传递操作。 我有我的类
SimpleAction
,指向它的指针存储在
Concurrency::concurrent\u队列中

使用此定义和“消费”逻辑,它可以工作:

typedef Concurrency::concurrent_queue<SimpleAction *> ActionQueue;

while (true)
   {
   SimpleAction *action = nullptr;
   while (m_queue.try_pop(action))
      {
      action->process();
      delete action;
      }
   Sleep(100);
   }
typedef并发::并发队列ActionQueue;
while(true)
{
SimpleAction*action=nullptr;
while(m_queue.try_pop(action))
{
动作->过程();
删除操作;
}
睡眠(100);
}
但是,当我将其更改为std::unique_ptr时,如下所示:

typedef Concurrency::concurrent_queue<std::unique_ptr<SimpleAction>> ActionQueue;

while (true)
   {
   std::unique_ptr<SimpleAction> action;
   while (m_queue.try_pop(action))
      {
      action->process();
      }
   Sleep(100);
   }
typedef并发::并发队列ActionQueue;
while(true)
{
std::独特的ptr动作;
while(m_queue.try_pop(action))
{
动作->过程();
}
睡眠(100);
}
编译器给出以下错误消息:

F:\DevStudio\Vs2010\VC\INCLUDE\concurrent_queue.h(366):错误C2248:'std::unique_ptr::unique_ptr':无法访问类'std::unique_ptr'中声明的私有成员
具有
[
_Ty=`匿名名称空间'::SimpleAction
]
F:\DevStudio\Vs2010\VC\INCLUDE\memory(2347):参见“std::unique\u ptr::unique\u ptr”的声明
具有
[
_Ty=`匿名名称空间'::SimpleAction
]
F:\DevStudio\Vs2010\VC\INCLUDE\concurrent_queue.h(365):编译类模板成员函数“void Concurrency::concurrent_queue::_Copy_item(Concurrency::details::_concurrent_queue_base_v4::_Page&,size_t,const void*)”
具有
[
_Ty=标准::唯一性
]
编译器似乎不喜欢并发队列中的这种构造:

/*override*/ virtual void _Copy_item( _Page& _Dst, size_t _Index, const void* _Src )
{
    new( &_Get_ref(_Dst,_Index) ) _Ty(*static_cast<const _Ty*>(_Src)); 
}
/*覆盖*/virtual void\u Copy\u项目(\u Page&Dst,size\t\u Index,const void*\u Src)
{
新的(&_Get_ref(_Dst,_Index))_Ty(*static_cast(_Src));
}
这似乎合乎逻辑(我们不希望复制std::unique_ptr(必须移动它)

问题:

  • 这是VisualStudio2010的并发性/PPL库的已知问题/限制/功能吗
  • 这个问题在Visual Studio 2012中解决了吗
  • 还是我做错了什么
谢谢,
Patrick

我也有同样的问题,它对你有用吗?不,我没有找到任何解决方案(但我承认我没有进一步研究),在我的情况下,它不喜欢重新定义新的内存泄漏检查。我只是在它之前包含了concurrent_queue.h。
/*override*/ virtual void _Copy_item( _Page& _Dst, size_t _Index, const void* _Src )
{
    new( &_Get_ref(_Dst,_Index) ) _Ty(*static_cast<const _Ty*>(_Src)); 
}