0

我正在使用SSDeep fuzzy.dll对大量文件执行模糊散列。

如果我按顺序运行哈希,一切正常。如果我尝试使用多个线程,它会失败(应用程序终止,没有异常信息,日志中也没有任何内容)

我假设 DLL 不是线程安全的,并且一个线程正试图读取另一个的内存或类似的东西。

我想做的是让每个线程都有自己的dll“副本”。请注意,这不是一个实例——它都是静态/共享的——我只是想模拟如果同时运行两个引用 dll 的进程会发生什么——它们将拥有自己的内存空间等。 ..

在没有实际产生多个进程的情况下这可能吗?

<DllImport("C:\SSDeep\Fuzzy.dll",
    EntryPoint:="fuzzy_hash_filename",
    CallingConvention:=CallingConvention.Cdecl)>
Private Shared Function fuzzy_hash_filename(
                <InAttribute(),
                MarshalAsAttribute(UnmanagedType.LPStr)>
                ByVal Filename As String,
                ByVal Result As StringBuilder) As Integer
End Function


Public Shared Function FuzzyHash(Filename As String) As String
    Dim Ret As New StringBuilder
    Ret.Capacity = NativeConstants.FUZZY_MAX_RESULT
    Dim Success = fuzzy_hash_filename(Filename, Ret)
    If Success <> 0 Then
        Throw New Exception("SSDeep fuzzy hashing failed")
    End If
    Return Ret.ToString
End Function
4

2 回答 2

2

为此,您需要两个单独的进程或两个不同的 dll 副本,例如“fuzzy1.dll”和“fuzzy2.dll”

于 2012-08-07T12:19:45.963 回答
1

您不能在不同的线程中多次加载同一个本地 DLL。请参阅多次加载 Dll 以允许 .Net 中的多线程

我看到了不同的可能选项:

  • 产生多个进程
  • 正如 Eamonn McEvoy 所说,重命名您的 DLL,但这需要您知道您拥有的线程数并手动加载 DLL(因此很难使用ThreadPool例如)
  • 将任务排入队列并按顺序处理它们
于 2012-08-07T12:29:06.943 回答