При использовании std :: ref содержимое не изменяется после выхода из функции - PullRequest
0 голосов
/ 19 июня 2020

Я реализовал алгоритм Штрассена с потоками. Я передавал данные в потоки по структурам и запускал их функцией pthread_create(). Проблема в том, что я работаю с std::vector < std::vector<int> > и не могу передать это в структуру по ссылке. Я провел небольшое исследование и решил использовать std::ref, чтобы обернуть контент и отправить его в функцию. Проблема начинается после выхода из функции; Значение r1 не меняется (внутри меняется), значит, что-то не так.

Пример кода:

typedef struct threadData
{
    int n;
    std::vector< std::vector<int> > mat1;
    std::vector< std::vector<int> > mat2;
    std::vector< std::vector<int> > result;
}thread_Data;



/* function adding 2 matrixes */

void *add_Thread(void *arg)
{
    thread_Data *data = (threadData*)arg;
    for (int i = 0; i < data->n; ++i)
    {
        for (int j = 0; j < data->n; ++j)
        {
            data->result[i][j] = data->mat1[i][j] + data->mat2[i][j];
        }
    }

    pthread_exit(0);
}

/* ... code ... */

thread_Data adds;
adds = thread_Data{newSize, a11, a22, std::ref(r1)};  // here passing by std::ref

pthread_t adder;

pthread_create(&adder, NULL, add_Thread, &adds[i]);

pthread_join(adder, NULL);

/* and r1 value does not change here */

Как исправить?

ПРИМЕЧАНИЕ: * add_Thread ( ) работает отлично; Я использую в своей программе массив. Код здесь только для демонстрации идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...