Visual studio 2010 将Concurrency::concurrent_queue与std::unique_ptr一起使用
我想使用VisualStudio2010的并发库在线程之间传递操作。 我有我的类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_
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));
}