【发布时间】:2012-06-13 13:22:41
【问题描述】:
我有一个并行拟合程序(与 OpenMP 并行),它采用函数指针必须拟合的函数。我一直面临问题,最终我发现我将相同的函数指针传递给进行拟合的类,这与其他类发生冲突并产生混乱的结果。
如何“复制”函数指针以使其成为线程安全的,或者换句话说,使线程不相互冲突?
我指的函数也是这样的:
void function(const Real t, RealArray &a, Real &y)
{
#pragma omp critical //if I remove this line, the catastrophe happens and I get wrong results
{
if(t < FIDLength)
{
y = ...;
}
}
并且每个线程中的类构造如下:
FitClass fit(DSxAxis1.size(),initialValues_param.size(),function,function2,constraints3D);
function 和 function2 是函数指针。它们的使用方式相同。
谢谢。
【问题讨论】:
-
所有线程都使用相同的函数指针进行参数化......所以它们从同一个地址检索函数的值......我不明白你对共享数据的意思。
-
不看代码就很难判断。但您应该检查是否有任何导致有害竞争条件的数据共享。
-
好的,我会为函数指针添加一些代码。在我看来,共享正在发生,因为函数指针,它是一个指针意味着所有线程都在检查同一个内存区域。我认为事情就是这样发生的;不过不确定。
-
对不起。我不明白你的意思。你能解释一下吗?我也在考虑使用仿函数......也许这会有所帮助,但需要我改变我的拟合类的整个结构。
-
数学函数可以使用共享的辅助变量。
标签: c++ multithreading oop function-pointers openmp