2012-08-07 91 views
0

我正在使用SSDeepfuzzy.dll对大量文件执行模糊散列。在多线程应用程序中使用非线程安全的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 

回答

2

要做到这一点,你需要或者两个不同的过程或DLL,如“fuzzy1.dll”和“fuzzy2.dll”的两个不同的副本

+0

没有什么聪明的,我可以用应用程序域或西米做LAR?奇怪的是,多个副本的dll实际上可能比多个进程更可取,但我需要生成inter-on-the-fly。我没有考虑过 – Basic 2012-08-07 12:23:42

1

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

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

  • 产卵多个进程作为埃蒙·麦克沃伊说:
  • 重命名的DLL,但是这需要你知道你的线程数和手动加载的DLL (所以这将是很难用ThreadPool例如)
  • 排队任务,并依次对其进行处理
相关问题