0

わかりました、新しい試み、

コードを通常の から に変更vector<Individual>しましたvector<shared_ptr<Individual>>。それ以来、私のスレッドコードは機能せず、修正方法についての手がかりがありません。Start() は Individual の void メンバーですが、それらへのポインタしかない場合はどうすれば呼び出せますか?

std::vector<thread> threads;
for (int i=0;i<(Individuals.size()-howManyChampions-howManyMutations);i++) {
    threads.push_back(thread(&Individual::start,&Individuals.at(i)));
    if (threads.size() % 5 == 0) {
        for(auto& thread : threads){
            thread.join();
        }
        threads.clear();
    }
}
for(auto& thread : threads){
    thread.join();
}

ベクトルと非並列バージョンに戻すと機能します。

 for (int i=0;i<(int)Individuals.size();i++) {
    Individuals.at(i)->start();
}

魅力のようにも機能します。それで、スレッドpush_backに何か問題があると思いますか? エラー メッセージ (大まかに翻訳) は次のとおりです。

 instance created from »_Res std::_Mem_fn<_Res (_Class::*)(_ArgTypes ...)>::operator()(_Tp&, _ArgTypes ...) const [mit _Tp = std::shared_ptr<Individual>*, _Res = void, _Class = Individual, _ArgTypes = {}]«|
 instance created from »void std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__call(std::tuple<_Args ...>&&, std::_Index_tuple<_Indexes ...>, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type) [mit _Res = void, _Args = {}, int ..._Indexes = {0}, _Result = void, _Functor = std::_Mem_fn<void (Individual::*)()>, _Bound_args = {std::shared_ptr<Individual>*}, typename std::_Bind_result<_Result, _Functor(_Bound_args ...)>::__enable_if_void<_Res>::type = int]«|
 instance created from »std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type std::_Bind_result<_Result, _Functor(_Bound_args ...)>::operator()(_Args&& ...) [mit _Args = {}, _Result = void, _Functor = std::_Mem_fn<void (Individual::*)()>, _Bound_args = {std::shared_ptr<Individual>*}, std::_Bind_result<_Result, _Functor(_Bound_args ...)>::result_type = void]«|
 instance created from »void std::thread::_Impl<_Callable>::_M_run() [mit _Callable = std::_Bind_result<void, std::_Mem_fn<void (Individual::*)()>(std::shared_ptr<Individual>*)>]«|
 instanziiert von hier|
 Pointer to element type »void (Individual::)()« with Objecttype »std::shared_ptr<Individual>« incompatible
 Return-Command with value in »void« returning Function [-fpermissive]

みんなありがとう

4

1 に答える 1

1

これを試して :

threads.push_back(thread(&Individual::start,Individuals.at(i).get()));

shared_ptrwithgetメソッドで保持しているポインタにアクセスできます。shared_ptrただし、すべてのスレッドに参加する前に、 this のすべてのインスタンスを破棄しないように注意する必要がありますIndividual

于 2012-12-24T06:33:25.103 に答える