Как выполнить функцию члена класса в отдельном потоке с использованием класса потоков С++ 11?

Я пытаюсь использовать класс С++ 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();
}

Я использую Xcode 4.6.1 в Mac OS X 10.8.3. Я использую компилятор Apple LLVM 4.2, который поставляется с Xcode.

Приведенный выше код не работает. Ошибка компилятора говорит, что "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

Я новичок в С++ 11 и классе потоков. Может кто-нибудь мне помочь?

Ответы

Ответ 1

Экземпляр должен быть вторым аргументом, например:

std::thread t1(&SomeClass::threadFunction, *this, arg1, arg2);

Ответ 2

У меня все еще были проблемы с вышеупомянутым ответом (я думаю, что он жаловался, что он не мог копировать по умному указателю?), поэтому перефразировал его с помощью лямбда:

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

Затем он скомпилировался и работал нормально. AFAIK, это так же эффективно, и лично я считаю его более удобочитаемым.

(Примечание. Я также изменил join() на detach(), поскольку я ожидаю, что это было намерение.)