Функция-член std::thread Должен ли этот класс получить доступ к полям класса?
Учитывая класс, такой как:
class MyClass {
private:
vector<std::string> data;
void threadWork(std::vector<std::string> *data_ptr) {
// some thread work... e.g
for(int i=0; i < data_ptr->size(); i++) {
std::string next = (*data_ptr)[i];
// do stuff
}
}
void callThreadedFunc(int nthread) {
std::vector<std::thread> tgroup;
std::vector<std::string> data_ptr = &data;
for(int i=0; i < nthreads; i++) {
tgroup.push_back(std::thread(&myClass::threadWork, this, data_ptr));
}
for(auto &t : tgroup) {t.join();}
}
}
this
требуется передать в конструктор потока. Означает ли это, что я должен получить доступ ко всем полям классов, которые требуются потоку через this
вместо конкретных указателей поля? Например, threadWork()
должен получить доступ data
следующее:
void threadWork(MyClass *obj) {
// some thread work... e.g
for(int i=0; i < obj->data.size(); i++) {
std::string next = obj.data[i];
// do stuff
}
}
1 ответ
Решение
Поскольку threadWork
является функцией-членом, и вы правильно создаете поток, используя this
Вы можете обращаться ко всем переменным-членам экземпляра в обычном режиме, не нужно передавать указатель или ссылку на данные.
Делать только
std::thread(&myClass::threadWork, this)
достаточно, и тогда в функции потока вы можете использовать переменные-члены как обычно:
void threadWork(/* no argument */) {
// some thread work... e.g
for(int i=0; i < data.size(); i++) {
std::string next = data[i]; // Uses the member variable "normally"
// do stuff
}
}