Безопасно ли использовать std :: future и std :: обещание с не std :: thread? - PullRequest
0 голосов
/ 19 декабря 2018

Особенно я хочу использовать их с boost::asio::thread pool.Кажется, это работает на первый взгляд, но у меня есть сомнения.

Для пояснения: я знаю, что std::thread основан на boost :: thread, но asio::thread_pool по какой-то причине использует собственную реализацию потокаэто не очевидно для меня.

Я использую std::future и std::promise для межпотоковой сигнализации о прерывании и состоянии завершения пользовательского кода.

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Я не знаю, сможем ли мы ответить на этот вопрос самостоятельно, поэтому давайте посмотрим, что скажут эксперты, работавшие с Boost и стандартной библиотекой.

Энтони Уильямс, который был основным разработчиком и сопровождающимБиблиотека Boost Thread говорит об этом в своей книге "Параллельность C ++ в действии" (одна из книг в списке C ++ Definitive Books ) гласит:

Boost Thread Library предоставляет API, основанный на предложениях стандартной библиотеки потоков C ++ 11 и переносимый на многие платформы.Большинство примеров из книги можно изменить для работы с библиотекой Boost Thread путем разумной замены std:: на boost:: и использования соответствующих директив #include.Есть несколько возможностей, которые либо не поддерживаются (например, std::async), либо имеют разные имена (например, boost::unique_future) в библиотеке ускоряющих потоков.

Новая библиотека потоков C ++ в значительной степени основана напредыдущий опыт, накопленный благодаря использованию библиотек классов C ++, упомянутых ранее.В частности, библиотека Boost Thread Library использовалась в качестве основной модели, на которой основана новая библиотека, причем многие классы делятся своими именами и структурой с соответствующими из Boost. По мере развития нового стандарта это был двусторонний процесс, и библиотека потоков Boost сама изменилась, чтобы во многом соответствовать стандарту C ++, поэтому пользователи, переходящие с Boost, должны чувствовать себя как дома.

0 голосов
/ 19 декабря 2018

Все реализации «потоков», которые вы упоминаете в своих вопросах, являются моделями одного и того же: потоков целевой ОС.

Пока код, заполняющий std::promise, может в конечном итоге туда попасть, вы можете ждать на std::future.Для этих двух не имеет значения, как были запущены потоки ОС, на которых они работают.

0 голосов
/ 19 декабря 2018

std::thread это в значительной степени в зависимости от версии boost: поэтому он будет работать на 100%.

В общем, он должен работать со всеми другими версиями потоков.future и promise работают из-за модели памяти, и фактическая реализация потока для них не важна.

Единственная проблема, которую я могу себе представить, состоит в том, что обещание не передается в поток правильно, но этобыть просто некоторой ошибкой кодирования, и это каждый раз будет вызывать сбой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...