我们在我们的.NET应用程序中集成了HDF5库。C#.net HDF5 Nunit问题?
由于HDF5库不是线程安全的,我们使用lock()封装了它。我们的程序的一个线程在单个和独占的.h5文件上工作。
一些计算是并行完成的。对于并行部分,我们使用:从
- 线程
- Parallel.foreach()
:
- 的System.Threading
- System.Threading.Tasks。
一切工作的时候,我们正在执行一些单元测试与NUnit的V3.2.1螺纹,parallel.foreach,每个的单个实例上的一个单一的.h5文件,最终值文件execpt(因为它们是读取和写入多次)在我们的.h5文件中是不正确的(否则它们是正确的)。
我们怀疑HDF5库对所有四种组合(HDF5,NUnit,Threads,Parallel.foreach)都有问题。我们并不清楚发生了什么。
工具:Visual Studio 2015 Pro,NUNit v3.2.1和NUnit3TestAdapter v3.5.1。
有什么建议吗?
在此先感谢。
这里是我们如何写我们的文件里面的一些数据的样本:
public void SetGroupAttribute(H5LocId hdf5Handle, string location, string attribute, int value)
{
lock (AccessLock)
{
// Retrieve the attribute to read
var attributeId = GetAttribute(hdf5Handle, location, attribute);
H5GroupId rootId = null;
if (attributeId != null)
{
// Remove the old attribute
rootId = H5G.open(hdf5Handle, location);
H5A.Delete(rootId, attribute);
H5G.close(rootId);
}
// Create and set the new attribute value
H5DataSpaceId spaceId = H5S.create(H5S.H5SClass.SCALAR);
var attributeType = H5T.copy(H5T.H5Type.NATIVE_INT);
rootId = H5G.open(hdf5Handle, location);
attributeId = H5A.create(rootId, attribute, attributeType, spaceId);
H5G.close(rootId);
// Set the attribute value
int[] dims = new int[1];
dims[0] = value;
H5A.write<int>(attributeId, attributeType, new H5Array<int>(dims));
H5A.close(attributeId);
}
}
如果您使用锁,使用'Parallel'有什么意义?此外,锁定不会使魔术变成线程安全的。 AcessLock是静态还是实例字段?其他人使用手柄吗? –
我*不会*使用锁定来保护这样的资源。我会使用ActionBlock](https://msdn.microsoft.com/en-us/library/hh194684(v = vs.110).aspx)将消息发布到使用单个任务执行修改的块。 –
并行用于我们的不同计算(因为我们同时计算多个数据)。 AccessLock是一个单例内部的实例字段(对象)(其中.h5 IO方法在此处)。我会检查ActionBlock。谢谢! – Fabi1