Я собрал часть 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 для C ++ / CLI ??? Я задираюсь и вернусь с другими фактами позже.