gpt4 book ai didi

C++在循环中创建线程并将它们存储在 vector 中

转载 作者:行者123 更新时间:2023-11-30 05:18:01 24 4
gpt4 key购买 nike

我是第一次在 C++ 中使用线程,我想知道我的代码有什么问题。

我正在研究 Boruvka 的算法,我想创建线程来寻找组件的最短边。

这是我的代码:

    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

为了解释,我想给出组件和对 minEdges 中的元素的引用,其中将存储最便宜的边缘。然后我想加入所有线程并将所有最小边缘放入 mst。

这段代码给我一个在线错误,我在其中将线程推送到 vector ,但我找不到原因。那你能告诉我吗?

错误信息(我刚刚删除了文件的路径):

  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...>)
^
^

感谢您的回答。

最佳答案

几点...

  1. 不要修改已被其他线程使用的 vector (添加到 vector 可以移动其他元素)

  2. 迭代引用,而不是临时引用(auto g)

  3. 尽可能选择 emplace_back

  4. 可选择尝试 lambda 语法

  5. 使用同步来确保事情按照您认为的顺序发生(在您的情况下不需要 - 线程创建充当内存栅栏)

    std::vector<Edge> minEdges;
for (auto &g: components) {
minEdges.emplace_back();
}

std::vector<std::thread> threads;
for (size_t i=0; i<components.size(); ++i) {
threads.emplace_back([&]{findPath(components[i], minEdges[i]);});
}
// rest of code...

关于C++在循环中创建线程并将它们存储在 vector 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41914279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com