【问题标题】:Using a non-thread-safe dll in a multithreaded app在多线程应用程序中使用非线程安全 dll
【发布时间】:2012-08-07 12:16:09
【问题描述】:

我正在使用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

【问题讨论】:

    标签: .net multithreading


    【解决方案1】:

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

    【讨论】:

    • AppDomains 或类似的东西我能做什么?奇怪的是,dll 的多个副本实际上可能比多个进程更可取,尽管我需要即时生成互操作。没想到
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 2014-01-01
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多