C ++ threading - порождает объект (класс) в цикле?

0

Мне нужно создать объект класса. Например:

class Worker {
  Worker(int arg1, Object *obj);
  void workLoop() { while(true) { ... } }
}

И мне нужно порождать потоки цикла с созданием объектов. Когда я делаю это "статический", он работает:

thread th1(&Worker::workLoop, Worker(args...));
thread th2(&Worker::workLoop, Worker(other args...));

Но я не могу создать это в цикле. Я пытался:

for (...) {
  thread th(&Worker::workLoop, Worker(...));
  threadsVector.push_back(std::move(th));
}

... но работает только первая нить.

Кроме того, у меня в классе Worker это:

std::thread spawn() {
    return std::thread(&Worker::workLoop, this);
}

Я не знаю, как это сделать, и почему цикл не может правильно порождать мои потоки.

  • 0
    что вы намерены делать workLoop? Какова его функция? если он не должен быть уникальным для класса, я бы порекомендовал лямбда-выражение и передал бы рабочий объект в качестве аргумента.
  • 1
    Вы автоматически инициализируете объект потока во втором случае. Когда он выходит из области видимости, он разрушается. Это завершает присоединяемые потоки.
Показать ещё 5 комментариев
Теги:
multithreading
c++11

1 ответ

3
Лучший ответ

попробуй это

class Worker{
   Worker(int arg, Object *obj)
   void workLoop() { while(true) { ... } }
}; // do not forget the semicolon

....

vector<thread> pool;

auto func = [](Worker w){
     w.workLoop();
};

// example with thread
for (int i = 0; i < 5; ++i)
   pool.push_back(thread(func, Worker(5, obj)));

for (int i = 0; i < pool.size(); ++i)
   pool[i].join();
// example

создайте выражение лямбда, которое принимает рабочий объект и вызывает метод workLoop внутри, тогда вы можете передать лямбду в качестве объекта и передать ему аргумент внутри конструктора потока

  • 0
    Спасибо, теперь работает как шарм. Я не думал о лямбде.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню