Я новичок в потоках 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 (компилятор по умолчанию).
Аргументы переданы по значению конструктору 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);
// ^^^^
Других решений пока нет …