【问题标题】:C++: OpenMP: Copying function pointers for multithreadingC++:OpenMP:为多线程复制函数指针
【发布时间】: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


【解决方案1】:

我使用了一个半仿函数并且它起作用了。所以我的拟合类现在有一个模板参数,其中包含函数、它的导数和其他东西。这工作正常。

结果:并非所有 std 函数都是线程安全的。

【讨论】:

  • 您使用了哪些数学函数?有些使用全局变量。我相信gamma() 使用全局变量,不过我不确定。
  • 余弦、正弦和指数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 2017-02-09
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多