Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

Многопоточность в С++: создать поток для конкретного объекта с передачей в конструктор имени нестатической функции

Здравствуйте, недавно пришлось заняться разработкой многопоточного приложения (впервые) и наткнулся на такую проблему: позарез нужно создать поток для конкретного объекта с передачей в конструктор имени нестатической функции, гугл ничего путного не дал.
Подскажите, это вообще возможно? Если нет, то как это 'лечиться'?
В абстракции: есть класс System, у него есть нестатический метод private update() который я должен отслеживать, путем инициализации указателя private thread* Thread в конструкторе класса.
P.S в update вызывается метод move(...), который привязан к объекту, т.е я не могу сделать update статическим без создания контейнера, хранящего все данные о пользователях, а это затратно
#include //еще включения ... class System { //некоторые поля и методы... //... thread* Thread; static thread* sThread;
System() { Thread = new thread(update);//ошибка! отсутствуют экземпляры констуктора соответствующий ... для std::thread::thread (void()) } void update() { //... move(...); //... } void move() { //работает с полями объекта } };
{ //где-то создается System* system = System; }
P.S(2) Перелез с c#, там можно инициализировать потоки нестатическими методами(вроде), не судите строго


Ответ

В документации говорится, что конструктор выглядит так:
template< class Function, class... Args > explicit thread( Function&& f, Args&&... args );
поэтому могу предположить, что следует использовать лямбда-функцию как-то так:
new thread([&]() { this.update(); })
В любом случае следует быть осторожным со временем жизни объектов.

Комментариев нет:

Отправить комментарий