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

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

Я использую 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

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

15

Решение

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

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

Другие решения

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

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

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

(Примечание: я также изменился join() в detach() как я и ожидал, это было намерением.)

1

По вопросам рекламы [email protected]