Search on the blog

2015年4月19日日曜日

スレッドに参照を渡したい場合はrefを使う

 C++でスレッドに参照を渡すときの話。

まずダメな例から。
#include <iostream>
#include <vector>
#include <future>

using namespace std;

int solve(vector<int> &x) {
    x[0] += 100;
    return x[0];
}

int main(int argc, char **argv) {
    
    vector<int> v{1,2,3};

    future<int> fut = async(launch::async, solve, v);

    cout << fut.get() << endl;
    cout << v[0] << endl;

    return 0;
}
上記のプログラムを実行すると、

101
1

と表示される。vector<int> v は参照渡しされているように見えるが、実際はされていない。

スレッドに参照渡しをする場合は、以下のようにrefを使って参照ラッパーを渡すようにしなければならない。
#include <iostream>
#include <vector>
#include <future>

using namespace std;

int solve(vector<int> &x) {
    x[0] += 100;
    return x[0];
}

int main(int argc, char **argv) {
    
    vector<int> v{1,2,3};

    future<int> fut = async(launch::async, solve, ref(v));

    cout << fut.get() << endl;
    cout << v[0] << endl;

    return 0;
}

実行結果は、
101
101
となる。

0 件のコメント:

コメントを投稿