Как асинхронно выполнить метод от unique_ptr до объекта?

Я создал уникальный указатель на объект, подобный этому:

std::unique_ptr<MyClass> myObj(new MyClass(arg1, arg2));

И там есть метод, который мне нужно выполнить в параллельном потоке. Я не хочу ждать, пока это закончится. Он будет запускать цикл for, ждать чего-то и завершать в свое время.

Я попытался назвать это так:

std::async(std::launch::async, &MyClass::MyMethod, myObj.get(), someArg, anotherArg);

а также вот так:

std::async(std::launch::async, [&] {myObj->MyMethod(someArg, anotherArg); });

Оба вызова завершаются успешно и выполняют все, что есть в методе. Но я не получаю никакого параллелизма. Выполнение ожидает везде, откуда я это вызываю, и не продолжается до тех пор, пока метод не будет завершен. Что было бы хорошим способом запустить этот метод в своем собственном потоке, а не ждать его? Должен ли я использовать некоторые специальные флаги компилятора для достижения этой цели? Я использую GCC 4.8.1 в Ubuntu.

0

Решение

Проблема с std::future вернулся из std::async, Поскольку задача не откладывается, std::future объект разрушается сразу. Это заставляет деструктор блокироваться, пока выполнение потока не закончится. Вы должны держаться за std::future object`.

2

Другие решения


По вопросам рекламы [email protected]