C ++线程和变量

时间:2019-01-27 21:04:00

标签: c++ multithreading c++11

我编写的程序存在问题。我有返回指针的函数,并且在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 :(得分:1)

不返回变量,将指针传递给变量,并将值也设置为指向该点的位置。

即:

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.
}

答案 1 :(得分:0)

类似这样的东西:

std::thread _th1([&]() { arrTh1 = SplitFirstArray_1st(rootArr); });

答案 2 :(得分:0)

启动线程的函数无法以正常方式返回值。因此,应将它们声明为RegExp("^[a-zA-Z].*")

常见方法是分配一个受保护的全局变量。您应该使用互斥体(或其他方法)来保护自己,以避免种族冲突。

split()

在其他线程(包括主线程)中使用指针时,还需要使用相同的互斥量(或选择其他方法)来保护指针的使用。

,请删除arrSopited1和arr0。它将使arrTh1指针不可用。

请注意,如果您使用void函数,则可以使用mutex m; double *arrTh1 = nullptr; double* aSplitFirstArray_1st(double *arr0){ ... m.lock(); arrTh1 = arrSplited1; m.unlock(); } 返回值。