Использование C++ 17: наличие
using working_t = bool;
std::map<std::thread, working_t> _pool;
Я пытаюсь добавить новую ветку к этой карте, но не могу найти подходящего синтаксиса ..
class ThreadPool {
std::map<std::thread, working_t> _pool;
void init() {
_pool.emplace(&ThreadPool::thread_init, this, false);
}
void thread_init();
};
Это должно добавить поток к карте со значением false, но он не может компилироваться .. Возможно ли это?
Я использую emplace, чтобы избежать копий. Emplace должен создавать типы с заданными аргументами
Нужен ли вам знак равенства между init()
и {
?
тип промаха, фиксированный
Какой у вас вариант использования для поиска цепочки на карте? У вас никогда не может быть другого экземпляра этого потока.
Тебе нужно:
_pool.emplace(
std::piecewise_construct,
std::forward_as_tuple(&ThreadPool::thread_init, this),
std::forward_as_tuple(false)
);
... чтобы различать списки аргументов для ключа и значения. Однако тогда вы столкнетесь с проблемой, что у std::thread
нет operator <
, но это уже другой вопрос :)
зачем нужен оператор <при установке?
@MrSmith он нужен более или менее всегда, поскольку std::map
- это заказанный контейнер. Я также ожидаю проблем с постоянством ключа (можно ли вообще использовать const std::thread
?), Так что, возможно, карта здесь не тот контейнер.
@MrSmith, потому что ключи в std::map
отсортированы
@MrSmith не особо разбирается в размещении, но карты - это отсортированные контейнеры, поэтому ключи должны иметь <
Понятно .. Я хотел сохранить состояние потока, поэтому я создам карту с идентификатором потока и его состоянием ..
@MrSmith, могу я предложить два std::vector<std::thread>
, один для активных потоков, а другой для неактивных?
@QUentin idk .. это может стоить во время выполнения
@MrSmith std::thread
не имеет ни std::hash
, ни operator ==
, так что и std::unordered_map
тоже (если, конечно, вы не реализуете свой собственный компаратор и хешер). Я не думаю, что решение с двумя векторами будет иметь какое-либо измеримое влияние на производительность.
@MrSmith Если вы просто хотите просто сохранить состояние потока, наличие карты идентификатора потока для состояния действительно звучит как хорошая идея. Однако остается вопрос, как вы будете хранить свои потоки в пуле потоков.
Вы получаете конкретную ошибку компилятора? Наверное по поводу копирования
std::thread
?