Я реализую свою собственную очередь, которая блокируется на .pop()
. Эта функция также принимает дополнительный аргумент, который является таймаутом. Так что на данный момент у меня есть такой код:Исключение исключения с кодом возврата
template <class T>
class BlockingQueue {
private:
std::queue<T> m_queue;
std::mutex m_mutex;
std::condition_variable m_condition;
public:
T pop(uint64_t t_millis) {
std::unique_lock<std::mutex> lock(m_mutex);
auto status = m_condition.wait_for(
lock,
std::chrono::milliseconds(t_millis),
[=] {
return !m_queue.empty();
}
);
if (!status) {
throw exceptions::Timeout();
}
T next(std::move(m_queue.front()));
m_queue.pop();
return next;
};
}
где exceptions::Timeout
мой обычай исключение. Теперь я думал об этом исключении, бросая с точки зрения производительности. Было бы лучше вернуть какой-то код возврата из этой функции? Как это влияет на производительность?
Также, поскольку .pop
уже возвращает что-то, как реализовать дополнительный код возврата? Я полагаю, что потребуется новая структура, которая содержит как T
, так и код возврата. Неужели это увеличение сложности действительно стоит того?
Является ли время исключительным случаем? Если да, бросьте исключение. Если нет, то реализуйте его по-разному. –
[FYI] Вы не можете возвращать элемент очереди из 'pop': http://stackoverflow.com/questions/25035691/why-doesnt-stdqueuepop-return-value – NathanOliver
' pop() ', который возвращает значение * и * выдает исключение? Хорошо, тогда я думаю. –