когда выполнить после fiber.detach ()?

void helloFiber(boost::fibers::future<void> &f)
{
cout << "Hello, boost::fiber" << endl;
f.get();
}

int main()
{
boost::fibers::promise<void> pm;
boost::fibers::future<void> ft = pm.get_future();
{
boost::fibers::fiber f(helloFiber, std::move(ft));
cout << "Before join." << endl;
f.detach();
}
pm.set_value();
cout << "After join." << endl;
return 0;
}

Эта программа выводит: перед соединением. После присоединения. Здравствуйте, boost :: fiber.

Почему не выводится: до присоединения. Здравствуйте, boost :: fiber После присоединения.

1

Решение

Вы должны изменить сигнатуру helloFiber () на rvalue ссылку на будущее (вы перемещаете будущее).

Поскольку вы отсоединяете волокно, планировщик должен присоединиться к нему (в вашем примере при уничтожении).

Пожалуйста, посмотрите на: http://www.boost.org/doc/libs/1_62_0/libs/fiber/doc/html/fiber/fiber_mgmt.html (раздел: запуск перечисления):

‘запуск перечисления указывает, переходит ли управление немедленно во вновь запущенное волокно.’

boost::fibers::fiber f( boost::fibers::launch::post, helloFiber, std::move(ft));
boost::fibers::fiber f( boost::fibers::launch::dispatch, helloFiber, std::move(ft));

По умолчанию это сообщение, но вы хотите отправить, поэтому вывод:

Здравствуйте, boost :: fiber
Прежде чем присоединиться.
После присоединения.

Он никогда не напечатает: «До присоединения. Здравствуйте, boost :: fiber После присоединения. ‘
потому что вы положили

cout << "Before join." << endl;

после

   boost::fibers::fiber f(helloFiber, std::move(ft));
0

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

Других решений пока нет …

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