Следующий код должен прекращаться менее чем за 200 мс: < /p>
#include
#include
#include
#include
#include
using namespace std::chrono_literals;
std::promise p1;
std::atomic_bool p2_is_set{false};
std::promise p2;
int main() {
// p1.set_value_at_thread_exit();
// p1.get_future().wait_for(0ms); // this does not hang
// (also, p2 does not hang if p1 is waited for)
std::jthread set_p2([](const std::stop_token& token) {
p2.set_value_at_thread_exit();
p2_is_set = true;
p2_is_set.notify_one();
while (!token.stop_requested()) {
std::this_thread::sleep_for(100ms);
}
});
p2_is_set.wait(false);
p2.get_future().wait_for(0ms); // this hangs
set_p2.request_stop();
}
К сожалению, он висит в p2.get_future (). wait_for (0ms) бесконечно, и мне интересно, почему. Я могу воспроизвести проблему в MSVC 17.10 (https://godbolt.org/z/a3mfhwftj), но не в других компиляторах.
p1.get_future().wait_for(0ms) не висит; и когда я включаю это, p2.get_future (). wait_for (0ms) тоже останавливается. иметь значение. Что mutex принадлежит потоку, который называется p2.set_value_at_thread_exit () . В частности, p2._mypromise._state._assoc_state-> _ Mtx разблокируется до p2.set_value_at_thread_exit () и все еще заблокирован после. Код: < /p>
#include
#include
int main() {
std::promise p;
p.set_value_at_thread_exit();
p.get_future().wait_for(std::chrono::seconds(0));
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... t-time-out
Почему std :: future :: wait_for () не Time Out? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1741785261
Anonymous
Следующий код должен прекращаться менее чем за 200 мс: < /p>
#include
#include
#include
#include
#include
using namespace std::chrono_literals;
std::promise p1;
std::atomic_bool p2_is_set{false};
std::promise p2;
int main() {
// p1.set_value_at_thread_exit();
// p1.get_future().wait_for(0ms); // this does not hang
// (also, p2 does not hang if p1 is waited for)
std::jthread set_p2([](const std::stop_token& token) {
p2.set_value_at_thread_exit();
p2_is_set = true;
p2_is_set.notify_one();
while (!token.stop_requested()) {
std::this_thread::sleep_for(100ms);
}
});
p2_is_set.wait(false);
p2.get_future().wait_for(0ms); // this hangs
set_p2.request_stop();
}
К сожалению, он висит в p2.get_future (). wait_for (0ms) бесконечно, и мне интересно, почему. Я могу воспроизвести проблему в MSVC 17.10 (https://godbolt.org/z/a3mfhwftj), но не в других компиляторах.
p1.get_future().wait_for(0ms) не висит; и когда я включаю это, p2.get_future (). wait_for (0ms) тоже останавливается. иметь значение. Что mutex принадлежит потоку, который называется p2.set_value_at_thread_exit () . В частности, p2._mypromise._state._assoc_state-> _ Mtx разблокируется до p2.set_value_at_thread_exit () и все еще заблокирован после. Код: < /p>
#include
#include
int main() {
std::promise p;
p.set_value_at_thread_exit();
p.get_future().wait_for(std::chrono::seconds(0));
return 0;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79503589/why-does-stdfuturewait-for-not-time-out[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия