programming

C/C++ Tech

【C++】classでthreadを利用したときにthisを引き継ぐ方法

2022年1月29日

「ロナえる」の夫です。

最近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をプログラムが走り出してからの途中でも扱うことができます。

先ほどのコードは次のように修正をします。

しかし、これだけだと、messageprocess内で利用できません。

processはclass内の関数でありながら、外部関数での扱いと同じでprivateの関数・変数をprocess内で利用することができません。

とはいえ、そのためにprivate関数・変数をpublicにするのは良くないので、公開用の関数を用意してあげます。

なので、最終的な次のコードとなります。

おわりに

class内でthreadを利用する時、引数でclassのインスタンス(this)を渡すことで、thread内でもthisを利用することができましたね。

もしもっといい方法を知っている方が入ればコメントください。よろしくお願いします!

-C/C++, Tech,
-, , , , ,