gpt4 book ai didi

c++ - C++ 中的多线程抛出线程构造函数失败 : Resource temporarily unavailable

转载 作者:行者123 更新时间:2023-11-30 02:42:50 26 4
gpt4 key购买 nike

编辑:

我正在以矩阵乘法为例学习多线程,我创建了这个程序:

#include <iostream>
#include <vector>
#include <thread>
#include <functional>

using namespace std;

int N = 50;
void do_multiply_for_row(const vector<vector<int> >& matrix, int i, int N, vector<int>& answer) {
for (int j = 0; j < N; j++) {
answer[j] = 0;
for (int k = 0; k < N; k++) {
answer[j] += matrix[i][k] * matrix[k][j];
}
}
cout << "Done " << i << endl;
}

int main() {
vector<vector<int> > matrix(N, vector<int> (N, 0));
int x = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
matrix[i][j] = x++;
}
}
vector<vector<int> > result(N, vector<int> (N, 0));
vector<std::thread> threads;
for (int i = 0; i < N; i++) {
threads.push_back(std::thread(std::bind(do_multiply_for_row, std::cref(matrix), i, N, std::ref(result[i]))));
}
for (int i = 0; i < threads.size(); i++) threads[i].join();
for (int i = 0; i < N; i++) {
for (int j =0; j < N; j++){
cout << result[i][j] << " ";
}
cout << endl;
}
return 0;
}

我最终会创建 50 个线程,但得到了 libc++abi.dylib:终止于类型为 std::__1::system_error 的未捕获异常:线程构造函数失败:资源暂时不可用

我创建的线程数量有限制还是我做错了什么?

最佳答案

线程实现是系统相关的,线程数量的限制也是如此。

您的错误消息显示:“resource_unavailable_try_again — 系统缺少创建另一个线程所需的资源,或者系统对将超出进程中的线程数。”(标准 c++,30.3.1.2/8):

多线程效率有一个极限,即thread::hardware_concurrency() .该值是硬件支持的线程数的近似值(但如果没有线索,该函数可能会返回 0):

  • 您当然可以创建更多线程,但您的操作系统必须切换上下文才能让它们运行(即暂停一些正在运行的线程,让等待的线程也有机会执行)。这意味着一些线程不会真正并发运行。

  • 如果您运行的线程少于 thread::hardware_concurrency(),则您无法确定是否真正使用了并发:除您之外的其他进程也可能使用一些可用的容量。

从这个角度来看有两个提示。首先你可以插入一个 this_thread::yield();在线程中,特别是如果它们有很重的循环。如果所有硬件线程都忙,这为其他线程提供了调度机会。其次,你可以考虑 thread pools :创建固定数量的线程,每次完成计算时从队列中挑选任务。

关于c++ - C++ 中的多线程抛出线程构造函数失败 : Resource temporarily unavailable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26691340/

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