17

C++11 のstd::threadクラスを使用して、クラスのメンバー関数を実行して並列実行しようとしています。

ヘッダー ファイルのコードは次のようになります。

class SomeClass {
    vector<int> classVector;
    void threadFunction(bool arg1, bool arg2);
public:
    void otherFunction();
};

cpp ファイルは次のようになります。

void SomeClass::threadFunction(bool arg1, bool arg2) {
    //thread task
}

void SomeClass::otherFunction() {
    thread t1(&SomeClass::threadFunction, arg1, arg2, *this);
    t1.join();
}

Mac OS X 10.8.3 で Xcode 4.6.1 を使用しています。私が使用しているコンパイラは、Xcode に付属の Apple LLVM 4.2 です。

上記のコードは機能しません。コンパイラエラーは、"Attempted to use deleted function".

スレッド作成の行に、次のメッセージが表示されます。

In instantiation of function template specialization 'std::__1::thread::thread<void (SomeClass::*)(bool, bool), bool &, bool &, FETD2DSolver &, void>' requested here

私はC++ 11とスレッドクラスが初めてです。誰かが私を助けることができますか?

4

2 に答える 2

22

インスタンスは、次のように 2 番目の引数にする必要があります。

std::thread t1(&SomeClass::threadFunction, *this, arg1, arg2);
于 2013-03-31T21:16:46.250 に答える
1

上記の回答にはまだ問題がありました(スマートポインターをコピーできないと不平を言っていると思いますか?)ので、ラムダで言い換えました:

void SomeClass::otherFunction() {
  thread t1([this,arg1,arg2](){ threadFunction(arg1,arg2); });
  t1.detach();
}

その後、コンパイルして正常に実行されました。私の知る限り、これは同じくらい効率的であり、個人的には読みやすいと思います。

(注:意図したとおりに変更join()しました。)detach()

于 2015-04-24T12:24:56.813 に答える