2012-04-01 7 views
2

私は次のコードを使用しキャプチャのstd ::機能

struct WorkData 
{ 
    std::string name; 
    std::function<void(std::string)> Callback; 

    WorkData(){}; 
    WorkData(const WorkData& other) 
    { 
     name = other.name; 
     Callback = std::ref(other.Callback); 
    } 
}; 

WorkData data; // this is the data to pass to queue_task() function bellow 
data.Callback = std::bind(&ResultProcessor::Handler, resProc, std::placeholders::_1); 

template <typename Functor> 
void queue_task(Functor& fn, WorkData& workData) 
{ 
    group.run([&fn, workData](){ 
      workData.Callback("resultComming"); // runtime ERROR- access violation 
    }); 
} 

queue_task機能キューは(上からgroup.run(ラムダ)を呼び出すことによって)別のスレッドで非同期的に行われることに努めています。私が経験している問題は、workData.Callback()を呼び出す際にアクセス違反が発生することです。

group.run()の実行時にqueue_task()が実行されたときの状態のコピーを持つように、workDataを値で取得したいからです。と呼ばれる。クラッシュラインが

答えて

1

使用呼び出されたときに、上からresProcが生きている(破壊されない):

data.Callback = std::bind(&ResultProcessor::Handler, resProc, std::placeholders::_1); 

編集:私はworkData.Callbackは()の行に渡されたオブジェクトのインスタンス上で実行することを期待しますあなたのコピーコンストラクタのstd::refの意味は、古いWorkDataCallbackメンバーへの参照であり、コピーではありません。 Callback = other.Callbackはアクセス違反を避けるためにコピーを作成する必要があります(古いコールバックが解放された後にアクセスした可能性があります)。 resProcへの参照をstd::functionに保存するには、std::bindへの呼び出しでstd::ref(resProc)を使用する必要があります。

+0

私はEDITを私の質問に添えました。私はstd :: refを使用します。そうしないと、ResultProcessorの別のインスタンスでworkData.Callback( "resultComming")を呼び出すことになります。 – Ghita

+0

その場合、関数ではなくResultProcessorで 'std :: ref'を使用する必要がありますオブジェクト自体。つまり、最後のコードブロックで 'std :: ref(resProc)'をしてから、あなたのコピーコンストラクタで 'std :: function'の真のコピーを使うべきです。 –

+0

ResultProcessorインスタンスはstd :: function Ghita

関連する問題