Как прервать sleep_for соседнего потока

216
14 июля 2018, 06:20

В приложении создаётся второй поток в котором вызывается конструкция std::this_thread::sleep_for( … ).
Можно ли как то прервать этот sleep_for из другого потока имея экземпляр std::thread? Я понимаю что можно сделать флаг, запустить в цикле std::this_thread::sleep_for(std::this_thread::sleep_for(std::chrono::microseconds(1)) и на каждой итерации проверять флаг, но в моём случае большой оверхэд недопустим. И ещё если кто знает, можно ли как-то вызвать sleep_for соседнего потока?

using std::cout;
using std::endl;
using namespace std::chrono_literals;
std::mutex mut{};
void Foo1() {
    std::lock_guard<std::mutex> lock (mut);
    std::this_thread::sleep_for(std::chrono::seconds(10));
}
void main() {
    cout << "---- point 1 ----" << endl;
    std::thread th1(Foo1);
    // Вот тут надо прервать текущий sleep_for в th1.
    th1.join();
    cout << "---- point 2 ----" << endl;
    system("PAUSE");
}
Answer 1

В общем как сказал @VTT выше, тут необходимо применить std::condition_variable и вместо sleep_for использовать wait_for. Вот так изменится код примера:

using std::cout;
using std::endl;
using namespace std::chrono_literals;
std::mutex mut;
std::condition_variable condition;
void Foo1() {
    std::unique_lock<std::mutex> lock(mut);
    condition.wait_for(lock,std::chrono::seconds(10)); // Блокирует поток на 1 секунду либо до срабатывания condition.notify_one().
}
void main() {
    cout << "---- point 1 ----" << endl;
    std::thread th1(Foo1);
    condition.notify_one(); //Прерываем condition.wait_for в th1.
    th1.join();
    cout << "---- point 2 ----" << endl;
    system("PAUSE");
}
READ ALSO
Непрозрачная графика на прозрачном Jframe

Непрозрачная графика на прозрачном Jframe

возникла необходимость отображения непрозрачной графики на прозрачном Jframe c использованием BufferStrategy (если это вообще возможно)

171
Jsoup удаление аттрибута

Jsoup удаление аттрибута

Я хочу удалить из html-документа из тега embed аттрибут style:

180
Wildfly 10, деплой war файла

Wildfly 10, деплой war файла

Пытаюсь задеплоить на Wildfly сервер проектПри деплоинге war файла происходит ошибка

219