Создать вектор потоков

275
09 февраля 2020, 15:50

В зависимости от количества доступных системе потоков, надо использовать эти потоки. Хочу сделать это всё вектором. Вот два куска кода(все что до main одинаковое в обоих случаях). В первом без вектора, просто "в лоб", всё работает, и с увеличением потоков программа ускоряется (при 2 в 1.6 раз, при 4 в 2.6 раз). Второй кусок кода - попытка сделать через векторы. Потоки, вроде, создаются, но программа при любом их количество работает одинаково, не ускоряясь

#include <iostream>
#include <vector>
#include <ctime>
#include <thread>
#include <algorithm>
#include <Windows.h>
struct SLAU
{
public:
    SLAU(int n) : Size(n) //конструктор. Задает СЛАУ
    {
        System.resize(Size);
        for (auto &i : System)
        {
            i.resize(Size);
            for (auto &j : i)
            {
                j = rand() % 10;
            }
        }
    }
    void show_system() // Вывод исходной СЛАУ
    {
        for (const auto &i : System)
        {
            for (const auto &j : i)
            {
                std::cout << j << " ";
            }
            std::cout << std::endl;
        }
    }
    void show_div() //Вывод разбиения
    {
        for (const auto i : Div)
        {
            for (const auto j : i)
            {
                std::for_each(j.begin(), j.end(), [](int x){std::cout << x << " "; });
                std::cout << std::endl;
            }
            std::cout << std::endl << std::endl;
        }
    }
    void set_div() //Разбиваем систему на блоки по кол-ву потоков 
    {
        int k = 0;
        int count = threads;
        Div.resize(threads);
        for (auto &i : Div)
        {
            if (Size != 0)
            {
                i.resize(Size / count);
                Size -= (Size / count);
                count--;
            }
            else break;
            for (auto &j : i)
            {
                j.resize(System.size());
                std::copy(System[k].begin(), System[k].end(), j.begin());
                k++;
            }
        }
    }
    std::vector<std::vector<int>> get_vector(int i)
    {
        return Div[i];
    }
    int get_size()
    {
        return Size;
    }
    int get_threads()
    {
        return threads;
    }
private:
    int threads = 2;//std::thread::hardware_concurrency();
    int Size;
    std::vector<std::vector <int>> System;
    std::vector<std::vector<std::vector <int>>> Div;
};
struct ved_str
{
    //int number;
    std::vector<int> mas;
};
void main_string(std::vector<std::vector <int>> &vec, ved_str *str, int j, int eq_num) //поиск локальной ведущей строки
{
    int max_value = -1;
    int number = 0;
    for (int i = 0; i < vec.size(); i++)
    {
        if (j > eq_num)
        {
            eq_num++;
            continue;
        }
        else if (vec[i][j] > max_value)
        {
            max_value = vec[i][j];
            number = i;
        }
    }
    str->mas.push_back(max_value);
}
int main()
{
    double Time = 0;
        int size = 100;
        srand(time(NULL));
        SLAU s1(size);
        std::vector<std::thread> thrds;
        s1.set_div();
        ved_str Main_str;
//ПОТОКИ
        for (int j = 0; j < 10; j++) //
        {
            double start = clock();
            for (int i = 0; i < size; i++)
            {
                std::thread a(main_string, s1.get_vector(0), &Main_str, i, 0);
                std::thread b(main_string, s1.get_vector(1), &Main_str, i, 150);
                //std::thread c(main_string, s1.get_vector(2), &Main_str, i, 150);
                //std::thread d(main_string, s1.get_vector(3), &Main_str, i, 225);
                a.join();
                b.join();
                //c.join();
                //d.join();
                Main_str.mas.clear();
            }
            double end = clock();
            Time += (end - start) / 1000;
            std::cout << (end - start) / 1000 << std::endl;
        }
    system("pause");
    return 0;
}

2.

int main()
{
    double Time = 0;
        int size = 100;
        srand(time(NULL));
        SLAU s1(size);
        std::vector<std::thread> thrds;
        s1.set_div();
        ved_str Main_str;
        //ПОТОКИ
        double start = clock();
        for (int i = 0; i < size; i++)
        {
            int equation_number = 0;
            for (int j = 0; j < s1.get_threads(); j++)
            {
                thrds.push_back(std::thread(&main_string, s1.get_vector(j), &Main_str, i, equation_number));
                equation_number += s1.get_vector(j).size();
            }
            for (auto &j : thrds)
            {
                if (j.std::thread::joinable()) j.join();
            }
            int st = *std::max_element(Main_str.mas.begin(), Main_str.mas.end());
            thrds.clear();
            Main_str.mas.clear();
        }
        double end = clock();
        Time += (end - start) / 1000;
        std::cout << (end - start) / 1000 << std::endl;
    system("pause");
    return 0;
}
READ ALSO
Линковка .dll имея .h MinGW C++

Линковка .dll имея .h MinGW C++

есть в наличии динамическая библиотека (dll) и ее заголовок (

277
Socks4 работа с локальной сетью с++

Socks4 работа с локальной сетью с++

Решил разработать локальный прокси сервер, для просмотра и контроля трафикаПрочитал документацию, реализовал как там описано

258
Проблема при использовании getline при считывании с файла [дубликат]

Проблема при использовании getline при считывании с файла [дубликат]

Суть проблемы в следующем, я хочу считать объект b с текстового файла, для удобства блок этого объекта выделен плюсамиИсключений не вызывает,...

286
Преобразовать массив по формуле

Преобразовать массив по формуле

Нужно преобразовать массив по формуле b(i) = (a(i) - a(i-1))/i В теории, мой код должен работаь, но что то не так

308