「ロナえる」の夫です。
最近C++で並列処理をすることがありました。
C++には並列処理用の強い味方「thread」がいます。
これを使えば全て思い通り!と思いきや、class内の使ったら事件が・・・
今回は、「classでthreadを利用したときにthisを引き継ぐ方法」を備忘録も兼ねて書き記していきます。
classでthreadを使った時の問題
例えば次のようなコード。
Sample
クラスのメンバーmessage
に「Hello」を詰めてから、別スレッドでそれを出力するというもの。
同一クラス内で定義された関数と変数なので、関数内でもその変数を利用できるかと思いきやできない。。。
このクラスを含んだプログラムをビルドすると、次のエラーが出ます。
error: invalid use of 'this' outside of a non-static member function
std::cout << this->message << std::endl;
どうしてエラーになるのか?
ちゃんとはわかっていないのですが、this
とは何かが関わってそうです。
this
は生成されたインスタンスのポインタ(?)です。そのため、プログラムが走り出した後、途中でclassが生成されると決まるものです。
一方で、staticの関数では「静的」と言われるぐらいなので、プログラムが始まったと同時に中で使われている変数は何者なのか決まっている必要があります。
そのため、相容れない関係で、エラーになっているのだ思います。
エラーにならないためには?
今回は、static関数の引数として、this
を与えることで解決しました。
static関数に「外からこんなの入りますよ」という形で、引数として該当クラスを教えてあげます。
そうすれば、動的に変わったthis
をプログラムが走り出してからの途中でも扱うことができます。
先ほどのコードは次のように修正をします。
しかし、これだけだと、message
がprocess
内で利用できません。
process
はclass内の関数でありながら、外部関数での扱いと同じでprivateの関数・変数をprocess
内で利用することができません。
とはいえ、そのためにprivate関数・変数をpublicにするのは良くないので、公開用の関数を用意してあげます。
なので、最終的な次のコードとなります。
おわりに
class内でthreadを利用する時、引数でclassのインスタンス(this)を渡すことで、thread内でもthisを利用することができましたね。
もしもっといい方法を知っている方が入ればコメントください。よろしくお願いします!