#c
#c
Вопрос:
Я просто пытаюсь создать несколько std::vector
потоков и запустить их.
Код:
thread t1(calc, 95648, "t1");
thread t2(calc, 54787, "t2");
thread t3(calc, 42018, "t3");
thread t4(calc, 75895, "t4");
thread t5(calc, 81548, "t5");
vector<thread> threads { t1, t2, t3, t4, t5 };
Ошибка: «функция std::thread::thread(const std::thread amp;)» (объявлена в строке 70 из «C:Program Files (x86) Microsoft Visual Studio 12.0 VC include thread») нельзя ссылаться — это удаленная функция
thread(const threadamp;) = delete;
В чем, по-видимому, проблема?
Ответ №1:
Поскольку потоки не копируются, а перемещаются, я рекомендую следующий подход:
std::vector<std::thread> threads;
threads.emplace_back(calc, 95648, "t1");
threads.emplace_back(calc, 54787, "t2");
threads.emplace_back(calc, 42018, "t3");
threads.emplace_back(calc, 75895, "t4");
threads.emplace_back(calc, 81548, "t5");
Комментарии:
1. Спасибо, что сработало! Можете ли вы объяснить мне, почему мой код не работает и что делает ваш?
2. Поскольку
thread
объект не может быть скопирован (когда вы вставляете значение в вектор, оно копируется), но сemplace
помощью, оно создается непосредственно на месте в самом векторе.
Ответ №2:
Вы можете использовать:
vector<thread> threads
{
std::move(t1),
std::move(t2),
std::move(t3),
std::move(t4),
std::move(t5)
};
Комментарии:
1. Правильно — конструктор копирования удален (что бы это значило для копирования потока?), Но его перемещение разрешено.
2. после этого я получаю следующую ошибку: C:Program Files (x86) Microsoft Visual Studio 12.0VCincludexmemory0(593): ошибка C2280: ‘std::thread::thread(const std::thread amp;)’ : попытка сослаться на удаленную функцию
3. C волшебным образом изобрел списки инициализаторов, перемещаемых из? Какой сейчас год, 2038?
4. @KerrekSB: Просто удалил ошибочное решение, спасибо.
Ответ №3:
Копирование thread
объектов запрещено. Перемещение разрешено. Но вы можете использовать a shared_ptr
для решения этой проблемы.
Мой любимый способ использования векторов потоков — через общий указатель.
std::vector<std::shared_ptr<std::thread>> threads;
Использование их таким образом всегда обеспечивает достаточную гибкость для расширения вектора (векторы используются для расширения).
threads.push_back(std::shared_ptr<std::thread>(new std::thread(amp;some_fn)));
Для вашего кода это будет выглядеть так:
using namespace std;
shared_ptr<thread> t1 = make_shared<thread>(calc, 95648, "t1");
shared_ptr<thread> t2 = make_shared<thread>(calc, 54787, "t2");
shared_ptr<thread> t3 = make_shared<thread>(calc, 42018, "t3");
shared_ptr<thread> t4 = make_shared<thread>(calc, 75895, "t4");
shared_ptr<thread> t5 = make_shared<thread>(calc, 81548, "t5");
vector<shared_ptr<thread>> threads { t1, t2, t3, t4, t5 };
Комментарии:
1. Я бы назвал это неправильным использованием shared_ptr. Здесь не задействовано совместное владение.
2. Возможно, кто-то запрашивает ссылку на этот поток (например, объединение потоков). Это не указано в вопросе. Тогда было бы проблемой, если вы дадите ссылку на c, которая может завершиться неудачей, если не потребуется немедленно. Для меня это часто облегчает работу с устаревшим кодом в больших фреймворках.