Я создал уникальный указатель на объект, подобный этому:
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.
Проблема с std::future
вернулся из std::async
, Поскольку задача не откладывается, std::future
объект разрушается сразу. Это заставляет деструктор блокироваться, пока выполнение потока не закончится. Вы должны держаться за std::future
object`.