在多线程应用程序中使用非线程安全的DLL

时间:2012-08-07 12:16:10

标签: .net multithreading

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

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

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

我想做的是让每个帖子都有自己的" copy"的dll。请注意,这不是一个实例 - 它全部是静态的/共享的 - 我只是想模仿如果引用dll的2个进程同时运行会发生什么 - 它们是&#d; dd有自己的记忆空间等......

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

<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

2 个答案:

答案 0 :(得分:2)

要做到这一点,你需要两个单独的进程或两个不同的dll副本,例如'fuzzy1.dll'和'fuzzy2.dll'

答案 1 :(得分:1)

您不能在不同的线程中多次加载相同的本机DLL。见Load Dll multiple times to allow multi threading in .Net

我看到了不同的选择:

  • 产生多个进程
  • 重命名您的DLL,如Eamonn McEvoy所说,但这需要您知道您拥有的线程数并手动加载DLL(例如,使用ThreadPool很难)
  • 将任务排队并按顺序处理