Есть ли способ отловить исключение, выдаваемое при надстройке boost :: promess, когда оно уже установлено? - PullRequest
0 голосов
/ 16 декабря 2018

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

Вот минимальный пример:

#include <iostream>
#include <boost/thread/future.hpp>

int main()
{
    boost::promise<int> promise;
    try {
        promise.set_value(0);
        promise.set_value(0);
    } catch (...) {
        promise.set_exception(boost::current_exception());
    }
    return 0;
}

Независимо от того, как я пытаюсь ее перехватить, она завершает мою программу с ошибкой:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::promise_already_satisfied> >'

И здесь вы можете увидеть это в действии.

1 Ответ

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

После set_value произойдет сбой другого set_value, и я держу пари, что set_exception в вашем блоке перехвата завершится неудачно по той же причине: результат (либо значение, либо исключение) уже установлен, обещание уже выполнено.По крайней мере, так работает std::promise, и я не удивлюсь, если boost::promise будет работать так же.

...