@rollthebones

Как заставить потоки работать с классом с++?

Нужно искать числа больше введенного в матрице так, чтобы на каждую строку матрицы выделялся отдельный поток.
Мой код не работает с моим классом и выдает огромную ошибку, в которой я не могу разобраться. (при работе с обычными типами, такими как простые числа int никаких проблем не возникает)

main.cpp

#include "Matrix.h"

int main() {
    std::int32_t number = 5;
    Matrix matrix;
    matrix.printMatrix();
    
    std::cout << matrix.findMoreThanNumber(number) << std::endl;
    return 0;
}


Matrix.h

#ifndef LAB9_MATRIX_H
#define LAB9_MATRIX_H
#include <iostream>
#include <ctime>
#include "mingw.thread.h"
#include <chrono>
#include <vector>


class Matrix {
 public:
    Matrix();
    void printMatrix() const;
    void findNumberInRow(const std::vector<std::int32_t> &row, const std::int32_t number);
    std::int32_t findMoreThanNumber(const std::int32_t number);

 private:
    std::int32_t rows, cols, count;
    std::vector<std::vector<std::int32_t>> matrix;
};

#endif  // LAB9_MATRIX_H



Matrix.cpp

#include "Matrix.h"

Matrix::Matrix() : rows(5), cols(5), count(0), matrix(rows) {
    srand(time(NULL));

    for (std::vector<int>& col : matrix)
    {
        col = std::vector<int>(cols);
    }

    for (std::size_t i = 0; i < rows; i++) {
        for (std::size_t j = 0; j < cols; j++) {
            matrix[i][j] = rand() % 10;
        }
    }
}

void Matrix::printMatrix() const {
    for (std::size_t i = 0; i < rows; i++) {
        for (std::size_t j = 0; j < cols; j++) {
            std::cout << matrix[i][j] << " ";
        } 
        std::cout << std::endl;
    }
    std::cout << std::endl;
}

void Matrix::findNumberInRow(const std::vector<std::int32_t> &row, const std::int32_t number) {
    std::cout << "Thread ID = " << std::this_thread::get_id() << " for" << std::endl;
    for (std::size_t i = 0; i < rows; i++) {
        std::cout << row[i] << " ";
        if (row[i] > number) {
            count++;
        }
    }
    std::cout << std::endl;
}


std::int32_t Matrix::findMoreThanNumber(std::int32_t number) {
    std::vector<std::thread> threads;
    for (std::size_t i = 0; i < cols; i++) {
        std::thread thread(findNumberInRow, matrix[i], number);
        threads.push_back(std::move(thread));
    }

    for (std::thread& thread : threads) {
        thread.join();
    }

    return count;
}


Ошибки

Что бы загрузить сюда не хватило места, поэтому загружаю так.
https://pastebin.com/PNLMbSeA
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вы передаете в std::thread не статический метод класса. Его нельзя передавать как обычную функцию. Его же можно вызывать только у какого-то объекта. Где thread этот объект возьмет-то?

Есть 2 варианта - передавайте лямбду, которая будет захватывать this и вызывать у него метод объекта.
Или, как показано тут, передавайте туда &Matrix::findNumberInRow c первым аргументом this.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы