C++ C+中的多线程+;抛出线程构造函数失败:资源暂时不可用

C++ C+中的多线程+;抛出线程构造函数失败:资源暂时不可用,c++,multithreading,c++11,C++,Multithreading,C++11,编辑: 我以矩阵乘法为例学习多线程,并创建了以下程序: #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, i

编辑:

我以矩阵乘法为例学习多线程,并创建了以下程序:

#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int N=50;
void do_乘以_行(常数向量和矩阵、int i、int N、向量和答案){
对于(int j=0;jcout线程的实现依赖于系统,对线程数量的限制也是如此

您的错误消息显示:“<强> ReaveCyOnAuthabeLyTyyz再次< /强> -该系统缺少创建另一个线程的必要资源,或者系统将超过进程中线程数的限制。”(标准C++,30.3.1.2/8):

  • 对于Linux来说,在应用程序上有一个限制

  • 对于Windows来说,没有,但是它的内存消耗,特别是它的堆栈,实际上会将它限制在几千个活动线程内。在上,您可以找到一个工具在您自己的系统上测试这些限制

多线程效率有一个限制,即。此值是硬件支持的线程数的近似值(但如果没有线索,函数可能返回0):

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

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


这个视图中的两个提示。首先,可以插入一个线程,特别是如果它们有沉重的循环。如果所有的硬件线程都很忙,这就给其他线程安排了机会。第二,你可以考虑:创建固定数量的线程,每次完成计算后从队列中挑选任务。

线程实现取决于系统,对线程数量的限制也是如此

您的错误消息显示:“<强> ReaveCyOnAuthabeLyTyyz再次< /强> -该系统缺少创建另一个线程的必要资源,或者系统将超过进程中线程数的限制。”(标准C++,30.3.1.2/8):

  • 对于Linux来说,在应用程序上有一个限制

  • 对于Windows来说,没有,但是它的内存消耗,特别是它的堆栈,实际上会将它限制在几千个活动线程内。在上,您可以找到一个工具在您自己的系统上测试这些限制

多线程效率有一个限制,即。此值是硬件支持的线程数的近似值(但如果没有线索,函数可能返回0):

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

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


这个视图中的两个提示。首先,可以插入一个线程,特别是如果它们有沉重的循环。如果所有的硬件线程都很忙,这就给其他线程安排了机会。第二,你可以考虑:创建固定数量的线程,每次完成计算后从队列中挑选任务。

NVM,我是一个一次又一次为同一行创建线程的小丑。您可以创建的线程数量有限制,这最终取决于您的系统。这很好。我正在比较单线程矩阵乘法和多线程矩阵乘法的结果,单线程总是赢!为eve做计算不同线程上的任意行不太可能提高性能。您必须分批分割行,并对每个线程上的多行运行计算。假设您有500行和4个内核,则对每个内核上的125行运行计算。
std::thread(std::bind(args…)
在语义上等同于
std::thread(args…)
。省略
std::bind
并保存一些击键。NVM,我是一个为同一行一次又一次创建线程的小丑。可以创建的线程数量有限制,最终取决于您的系统。这很好。我正在比较单线程矩阵乘法和多线程矩阵乘法的结果多复制和单线程总是成功的!对不同线程上的每一行进行计算不太可能提高性能。您必须分批分割这些行,并对每个线程上的多行运行计算。假设您有500行和4个内核,则对每个内核上的125行运行计算。
std::thread(std::bind)(args…)。