31

別のクラスメンバーを並行して複数回呼び出すクラスメンバーを作成しようとしています。

私は問題の簡単な例を書きましたが、これをコンパイルすることすらできません。std :: asyncの呼び出しで何が間違っていますか?問題は、関数をどのように渡すかにあると思います。

#include <vector>
#include <future>
using namespace std;
class A
{
    int a,b;
public: 
    A(int i=1, int j=2){ a=i; b=j;} 

    std::pair<int,int> do_rand_stf(int x,int y)
    {
        std::pair<int,int> ret(x+a,y+b);
        return ret;
    }

    void run()
    {
        std::vector<std::future<std::pair<int,int>>> ran;
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<2;j++)
            {
                auto hand=async(launch::async,do_rand_stf,i,j);
                ran.push_back(hand);    
            }
        }
        for(int i=0;i<ran.size();i++)
        {
            pair<int,int> ttt=ran[i].get();
            cout << ttt.first << ttt.second << endl;
        } 
    }
};

int main()
{
    A a;
    a.run();
}

コンパイル:

g++ -std=c++11 -pthread main.cpp 
4

2 に答える 2

64

do_rand_stfは非静的メンバー関数であるため、クラスインスタンス(暗黙のthisパラメーター)なしで呼び出すことはできません。幸いなことに、のようなパラメーターを処理std::asyncし、メンバー関数ポインターを明示的なパラメーターを受け取る関数に変換するために使用できます。必要なのは、呼び出しに渡し、:を渡すときに有効なメンバー関数ポインター構文を使用することだけです。std::bindbindstd::mem_fnthisthisstd::asyncdo_rand_stf

auto hand=async(launch::async,&A::do_rand_stf,this,i,j);

ただし、コードには他にも問題があります。まず、ingを使用std::coutstd::endlずに使用します。さらに深刻なことに、コピー可能ではなく、移動可能であるだけなので、 。を使用せずに名前付きオブジェクトを使用することはできません。または、結果を直接に渡します。#include<iostream>std::futurepush_backhandstd::moveasyncpush_back

ran.push_back(async(launch::async,&A::do_rand_stf,this,i,j));
于 2012-08-01T11:55:48.277 に答える
4

thisポインタを新しいスレッドに渡すことができます。

async([this]()
{
    Function(this);
});
于 2017-02-12T22:15:05.013 に答える