Есть ли способ использовать функцию-член класса для запуска в параллельном потоке без передачи * this в C ++ 11?

Я новичок в потоках C ++ 11 и пытаюсь использовать функцию-член класса для запуска в параллельных потоках.

В ответ на мой предыдущий вопрос я получил предложение:

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

Я реализовал вышеупомянутое предложение. Это убрало ошибку компиляции, которую я имел, но ввел ошибку времени выполнения. В другом вопросе я получил предложение удалить весь механизм копирования. На самом деле я не хочу копировать данные, потому что код предназначен для анализа методом конечных элементов и требует много памяти.

Есть ли способ, которым я могу сделать это?

Заголовок похож на следующее.

SomeClass {
vector<int*> someVariable;
public:
~SomeClass();
void threadedMethod(bool, bool); // Inside this method the
// member vector 'someVariable' is used.

void someMethod();               // In this function the threadedMethod has
// been used twice to make 2 different thread
};

Реализация someMethod,

void SomeClass::someMethod() {
thread t1(&SomeClass::threadedMethod, *this, arg1, arg2);
thread t2(&SomeClass::threadedMethod, *this, arg1, arg2);
t2.join();
t1.join();
}

Деструктор похож на следующее,

SomeClass::~SomeClass() {
int count  = someVariable.size();
for(int i=0; i < count; i++) {
delete someVariable[i];
}
}

ThreadMethod обращается к переменной. Операции являются данными параллельными. В результате ни один поток не запишет в тот же блок памяти. Опять же, память чтения и записи отличается. Там, я думаю, мне не нужны никакие замки.

Как видите, я использую *this и это вызывает много копий. Мне действительно нужно избегать этого. Любой может любезно предложить другой способ, который позволит мне избежать копирования?

Если вам нужно больше объяснений, пожалуйста, дайте мне знать. Если в моих силах, я постараюсь проработать как можно больше.

Я использую Intel Mac с OS X 10.8.3. Я кодирую на Xcode 4.6.1. Компилятор Apple LLVM 4.2 (компилятор по умолчанию).

0

Решение

Аргументы переданы по значению конструктору std::thread, Следовательно, это утверждение:

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

Запускает копию *thisчто не то, что вы хотите. Тем не мение, std::thread также может принять указатель к объекту, для которого должна быть вызвана функция-член, точно так же, как std::bind,

Поэтому, передавая this (вместо *thisв качестве аргумента, это указатель — вместо указанного объекта — он будет передан по значению и в конечном итоге скопирован. Это не вызовет создание копии SomeClassпо вашему желанию.

Таким образом, вы должны переписать приведенное выше утверждение следующим образом:

std::thread t1(&SomeClass::threadFunction, this, arg1, arg2);
//                                         ^^^^
3

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

Других решений пока нет …

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