Я работаю с потоками в первый раз на C++, и я хотел бы знать, что не так с моим кодом.C++ Создание потоков в цикле и сохранение их в векторе
Я работаю над алгоритмом Boruvka, и я хотел бы создать темы для поиска кратчайшего Edge для компонента.
Вот мой код:
std::vector<std::thread> threads;
std::vector<Edge> minEdges;
for (auto g: components) {
Edge minEd;
minEdges.push_back(minEd);
threads.push_back(std::thread (findPath, g, std::ref(minEdges.back())));
}
for (auto &i : threads) {
i.join();
}
for (Edge edge:minEdges) {
if (!contains(mst, edge)) {
addEdge(&mst, edge.n1, edge.n2, edge.weight);
}
}
void findPath(Graph &component, Edge &edge)
//finds cheapest edge
Для exlanation, я хотел бы дать компонент и ссылку на элемент в minEdges
, где будут храниться самые края. Затем я хочу присоединиться ко всем потокам и поместить все минимальные ребра в mst.
Этот код дает мне ошибку в строке, где I`m толкает потоки к вектору, но я не мог найти почему. Так что, пожалуйста, скажите мне?
Сообщение об ошибке (я просто удалил пути к файлам):
In instantiation of 'struct std::_Bind_simple<void (*(Graph, std::reference_wrapper<Edge>))(Graph&, Edge&)>':
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/thread:142:59:
required from 'std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(Graph&, Edge&); _Args = {Graph&, std::reference_wrapper<Edge>}]'
graph.cpp:232:82: required from here
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/functional:1505:61: error: no type named 'type' in 'class std::result_of<void (*(Graph, std::reference_wrapper<Edge>))(Graph&, Edge&)>'
typedef typename result_of<_Callable(_Args...)>::type result_type;
/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/include/c++/functional:1526:9: error: no type named 'type' in 'class std::result_of<void (*(Graph, std::reference_wrapper<Edge>))(Graph&, Edge&)>'
_M_invoke(_Index_tuple<_Indices...>)
^
^
Спасибо за ответы.
Извините, я его отредактировал. –
Что происходит, когда вы используете std :: ref на g? – Niall
Off topic: передача ссылок на векторные элементы в поток при нажатии элементов в векторе приводит к высокому риску того, что ссылки будут отображаться недействительными с помощью изменения размера, прежде чем потоки получат возможность запуска. – user4581301