C ++ темы и переменные - PullRequest
       9

C ++ темы и переменные

0 голосов
/ 28 января 2019

У меня проблема в программе, которую я пишу.У меня есть функции, возвращающие указатели, и в main () я хочу запустить их в потоках.

Я могу выполнять функции в потоках:

double* SplitFirstArray_1st(double *arr0){
    const UI arrSize = baseElements/4;
    std::cout << "\n1st split: \n";
    double *arrSplited1=nullptr;
    arrSplited1 = new double [arrSize];
    for(UI i=0; i<arrSize; i++){
        arrSplited1 = arr0;
    }

    for(UI j=0; j< arrSize; ++j){
        std::cout << arrSplited1[j] << " ";
        }
    return arrSplited1;
    delete [] arrSplited1, arr0;

}

в main ()

std::thread _th1(SplitFirstArray_1st, rootArr);
                _th1.join();

Выше нечто я послеУ меня есть еще один указатель:

*arrTh1=nullptr;

Я хотел бы использовать его в потоке, чтобы ему было присвоено значение, возвращаемое моей функцией SplitFirstArray_1st

arrTh1 = SplitFirstArray_1st(xxx);

Возможно ли такое действиебыть выполненным в протекторе?

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Функции, которые запускают поток, не могут возвращать значения обычным способом.Поэтому они должны быть объявлены как void.

Распространенным способом является присвоение защищенной глобальной переменной.Вы должны защитить один с мьютексами (или другими методами), чтобы избежать гонок.

mutex m;
double *arrTh1 = nullptr;


double* aSplitFirstArray_1st(double *arr0){
    ...
    m.lock();
    arrTh1 = arrSplited1;
    m.unlock();
}

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

ипожалуйста, не удалите arrSopited1 и arr0.это сделает указатель arrTh1 непригодным для использования.

Обратите внимание, что если вы используете функции async, вы можете использовать futures для возврата значений.

0 голосов
/ 31 января 2019

Не возвращайте переменную, передайте указатель на переменную и установите значение, на которое это тоже указывает.

т.е.:

void set_int(int* toset) {
  *toset = 4;
}

Это прекрасно работает с вещами, которыеуже указатели:

void set_ptr(int** toset) {
  *toset = new int[4];
  // ...
  *toset[0] = 2;
}

Вы можете знать, что данные безопасно использовать, если функция вернулась.

Полностью несвязанное примечание:

  return foo;
  // No point placing code here unless you used goto as it won't get executed.
  // Also: don't use goto.
}
0 голосов
/ 28 января 2019

Примерно так:

std::thread _th1([&]() { arrTh1 = SplitFirstArray_1st(rootArr); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...