Programming Serendipity

プログラミングを中心に種々雑多に書き留めます

マルチスレッドでクラスのメンバ関数を実行する場合(C++11 std::thread)

#include <thread>

class C{
public:
    // blah blah blah
    void run()
    {
        std::thread thd(&C::impl, 10);
        thd.join();
    }
    void impl(int n)
    {
        //do something
    }
};

int main()
{
    C c;
    c.run();
    return 0;
}

上記のコードをコンパイルすると、MSVC12EEでは
「1 引数を取り込む関数には評価されません。」
というエラーが表示される。

このエラーメッセージに惑わされてしばらく彷徨ったが、英語で検索したら一発で答えが出た。正解は

#include <thread>

class C{
public:
    // blah blah blah
    void run()
    {
        std::thread thd(&C::impl, this, 10);
        thd.join();
    }
    void impl(int n)
    {
        //do something
    }
};

int main()
{
    C c;
    c.run();
    return 0;
}

と、thisをthreadの第2引数に渡すことだった。 日本語でもすでにスライドで紹介(22ページ)されていたことに解決した後に気付く。 一番下のやり方しかしてなかった。