Я скомпилировал часть 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??? Я блефовал и вернусь с большим количеством фактов позже.