我编写的程序存在问题。我有返回指针的函数,并且在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);
这样的动作是否可以在胎面中执行?
答案 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();
}
返回值。