0

SSDeep を使用して、fuzzy.dll多数のファイルに対してファジー ハッシュを実行しています。

ハッシュを順番に実行すると、すべて正常に動作します。複数のスレッドを使用しようとすると、フォールオーバーします (アプリは例外情報なしで終了し、ログには何も記録されません)

私は、DLL がスレッドセーフではなく、あるスレッドが別のスレッドのメモリなどを読み取ろうとしていると想定しています。

私がやりたいことは、各スレッドが独自の dll の「コピー」を持つことを許可することです。これはインスタンスそのものではないことに注意してください-すべて静的/共有です-dllを参照する2つのプロセスが同時に実行された場合に何が起こるかをエミュレートしたいだけです-それらには独自のメモリスペースがあります。 ..

実際に複数のプロセスを生成しなくても、これは可能ですか?

<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

これを行うには、「fuzzy1.dll」と「fuzzy2.dll」など、2 つの別個のプロセスまたは dll の 2 つの異なるコピーが必要です。

于 2012-08-07T12:19:45.963 に答える
1

異なるスレッドで同じネイティブ DLL を複数回読み込むことはできません。DLL を複数回ロードして、.Net でマルチスレッドを許可するを参照してください。

考えられるさまざまなオプションが表示されます。

  • 複数のプロセスを生成する
  • ThreadPoolEamonn McEvoy が言ったように DLL の名前を変更しますが、これには、使用しているスレッドの数を把握し、DLL を手動でロードする必要があります (たとえば、使用するのは難しいでしょう)。
  • タスクをキューに入れ、順番に処理する
于 2012-08-07T12:29:06.943 に答える