6

Visual Studio 2010 の Concurrency ライブラリを使用して、スレッド間でアクションを渡したいと考えています。私は自分のクラスを持っており、SimpleActionそれへのポインタはConcurrency::concurrent_queue.

この定義と「消費」ロジックを使用すると、次のように機能します。

typedef Concurrency::concurrent_queue<SimpleAction *> ActionQueue;

while (true)
   {
   SimpleAction *action = nullptr;
   while (m_queue.try_pop(action))
      {
      action->process();
      delete action;
      }
   Sleep(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);
   }

コンパイラは次のエラー メッセージを表示します。

F:\DevStudio\Vs2010\VC\INCLUDE\concurrent_queue.h(366) : error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
    with
    [
        _Ty=`anonymous-namespace'::SimpleAction
    ]
F:\DevStudio\Vs2010\VC\INCLUDE\memory(2347) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
    with
    [
        _Ty=`anonymous-namespace'::SimpleAction
    ]
F:\DevStudio\Vs2010\VC\INCLUDE\concurrent_queue.h(365) : while compiling class template member function 'void Concurrency::concurrent_queue<_Ty>::_Copy_item(Concurrency::details::_Concurrent_queue_base_v4::_Page &,size_t,const void *)'
    with
    [
        _Ty=std::unique_ptr<`anonymous-namespace'::SimpleAction>
    ]
test.cpp(138) : see reference to class template instantiation 'Concurrency::concurrent_queue<_Ty>' being compiled
    with
    [
        _Ty=std::unique_ptr<`anonymous-namespace'::SimpleAction>
    ]

コンパイラは、concurrent_queue でのこの構成を好まないようです。

/*override*/ virtual void _Copy_item( _Page& _Dst, size_t _Index, const void* _Src )
{
    new( &_Get_ref(_Dst,_Index) ) _Ty(*static_cast<const _Ty*>(_Src)); 
}

これは論理的に思えます (std::unique_ptr をコピーする必要はありません (代わりに移動する必要があります)。

質問:

  • これは、Visual Studio 2010 の同時実行/PPL ライブラリの既知の問題/制限/機能ですか?
  • この問題は Visual Studio 2012 で解決されていますか?
  • それとも私は何か間違ったことをしていますか?

ありがとう、パトリック

4

0 に答える 0