Функция-член 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
    }
}
Другие вопросы по тегам