C++11多线程传递引用报错及段错误问题求助
解决C++11多线程传递vector引用的编译错误与段错误问题
咱们一步步拆解你遇到的两个核心问题:
1. 编译错误的原因
你的线程函数_function_需要接收一个非const左值引用std::vector<long long>&,但直接传递results_array[i]时,std::thread的构造函数会默认尝试拷贝这个vector——临时生成的拷贝对象无法绑定到非const的左值引用,这就导致了编译器抛出的result_of相关错误。你想到用std::ref是正确的方向,但还有更致命的越界问题没解决。
2. 段错误的根源
你初始化的results_array是一个空vector,但循环里直接用results_array[i]去赋值或访问——vector::operator[]不会自动扩容,当i从1开始时,容器的size是0,访问索引1属于越界访问,触发了未定义行为,也就是你看到的段错误。
修正后的代码示例
这里提供两种可行的修正方案,核心都是先确保results_array的元素是合法可访问的:
方案一:提前扩容vector
#include <thread> #include <vector> #include <iostream> void _function_(std::vector<long long>& results) { results.push_back(10); } int main() { const int N = 5; // 替换成你实际的N值 std::vector<std::thread> threads; std::vector<std::vector<long long>> results_array; // 提前将results_array扩容到N个空vector,确保索引合法 results_array.resize(N); // 循环从0开始(若业务需要i从1到N,可改用results_array[i-1]) for(int i = 0; i < N; ++i) { // 用std::ref传递引用,避免拷贝且满足函数参数要求 threads.push_back(std::thread(&_function_, std::ref(results_array[i]))); } // 等待所有线程完成 for(auto& th : threads) { th.join(); } // 验证结果 for(int i = 0; i < N; ++i) { for(auto val : results_array[i]) { std::cout << "线程 " << i << " 的计算结果: " << val << std::endl; } } return 0; }
方案二:循环中动态添加元素
如果不想提前固定size,也可以在每次循环时给results_array添加新元素,再用back()获取最新元素的引用:
for(int i=1;i<=N;i++){ // 先添加一个空vector到容器中 results_array.push_back(std::vector<long long>()); // 用back()获取刚添加的元素的引用,再通过std::ref传递给线程 threads.push_back(std::thread(&_function_, std::ref(results_array.back()))); }
关键修改点总结
- 确保
results_array的元素可合法访问:要么提前resize扩容,要么每次循环push_back后用back()访问。 - 用
std::ref传递引用:让线程函数直接操作results_array中的原vector,而非临时拷贝,同时满足函数的左值引用参数要求。
内容的提问来源于stack exchange,提问作者Chen Wei
相关产品推荐
相关产品推荐

