Повышение математики (функция ibeta_inv) не является потокобезопасным?

Я скомпилировал часть boost — функцию ibeta_inv — в 64-битную сборку .Net, и она отлично работала, пока я не начал вызывать ее из нескольких потоков. Затем он иногда возвращает неправильные результаты.

Я скомпилировал его, используя этот код (C++/CLI):

// Boost.h

#pragma once

#include <boost/math/special_functions/beta.hpp>

using namespace boost::math;

namespace Boost {

    public ref class BoostMath
    {
    public:
        double static InverseIncompleteBeta( double a, double b, double x )
        {
            return ibeta_inv(a,b,x);
        }
    };
}

Кто-нибудь пробовал это раньше?

Я НЕ пробовал это вне .Net, поэтому я не знаю, является ли это причиной, но я действительно не понимаю, почему, поскольку он отлично работает в однопоточном режиме.

Использование (C#):

private void calcBoost(List<Val> vals)
{
    //gives WRONG results (sometimes):
    vals.AsParallel().ForAll(v => v.BoostResult = BoostMath.InverseIncompleteBeta(v.A, v.B, v.X));
    //gives CORRECT results:
    vals.ForEach(v => v.BoostResult = BoostMath.InverseIncompleteBeta(v.A, v.B, v.X));
}

ОБНОВЛЕНИЕ: Как видно из моих комментариев ниже, я больше не уверен, что это проблема Boost. Может быть, это какая-то странная ошибка PLinq to C++/CLI??? Я блефовал и вернусь с большим количеством фактов позже.

8
задан Dan Byström 3 April 2012 в 11:39
поделиться