Нужен совет по дизайну класса - заполните вектор в потоке или верните будущее - PullRequest
0 голосов
/ 04 июня 2019

Я пишу класс, который должен выполнять различные трудоемкие операции в фоновом режиме. Сначала он получает какие-то данные с удаленного хоста и должен предоставить их обратно пользователю, завернутому в какой-то контейнер-вектор. Затем он должен периодически отправлять уведомления на удаленный хост. Результат отправки уведомлений не нужен. Также возможно, что классу будет предложено несколько раз получить данные с удаленного хоста, но отправка уведомлений в этот момент запрещена. Поэтому я сомневаюсь, какой подход выбрать.

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

class ThreadAndFutureClient
{
public:
    std::future<std::vector<Entry>> get_entries();

    // post to thread
    void send_notification();

// ok, we may assume this is hidden in pimpl, so not visible to the user,
// but still the presence of two buggs me a little
private:
    std::thread thread_;
}

или

class TheAllThreadClient
{
public:
    // post to thread
    void fetch_entries();

    // post to thread
    void send_notification();

    // return false if fetch entries is running in a thread currently,
    // return true if fetch entries is not running and fill in vector with fetched data
    bool get_entries(std::vector<Entry>& vector);


private:
    std::thread thread_;
}
...