Создание вектора

#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, которая может завершиться неудачей, если не потребуется немедленно. Для меня это часто облегчает работу с устаревшим кодом в больших фреймворках.