我們在我們的.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