0

関数ポインターを使用して適合させる必要がある関数を受け取る並列化された適合プログラム (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 は関数ポインタです。どちらも同じように使用されます。

ありがとうございました。

4

1 に答える 1

1

セミファンクターを使用しましたが、うまくいきました。したがって、フィッティング クラスには、関数、その派生物、およびその他のものを含むテンプレート パラメーターが含まれるようになりました。そして、これは適切に機能しました。

結果: すべての std 関数がスレッドセーフであるとは限りません。

于 2012-06-13T15:34:12.860 に答える