2016-03-23 4 views
0

Ich arbeite an der Umwandlung einer Anwendung mit einem Thread in eine Multithread-Anwendung.Sperren verwenden, um den Zugriff auf nicht threadsichere Bibliotheken zu steuern

Eine der Bibliotheken, die wir verwenden, ist laut ihrer Dokumentation nicht threadsicher. Also, dies zu umgehen ist die Antwort Schlösser zu verwenden (zumindest, dass mein Verständnis ist so weit ..)

Also ich meine Fäden kick off:

Parallel.ForEach(recordList, Sub(record) ProcessRecord(record)) 


Public Sub ProcessRecord(ByVal record As UploadRecord) 
    Dim controller As New UploadController() 
    controller.ProcessRecord(record) 
End Sub 

In der Klasse UploadController(), ich habe ein Sperrobjekt hinzugefügt.

private thisLock As Object = new Object() 

Ich verwende dann diese Sperre, um den Zugriff auf Aufrufe an meine nicht threadsichere Bibliothek zu steuern.

SyncLock (thisLock) 
        structureTemplatefs = IO.File.OpenRead(GetVersion(record, validationTemplatePathElement) & structureTemplateElement) 
        validator = New FileValidator(structureTemplatefs, record.FileData, True) 

        'Get all errors... 
        result = validator.Validate(FileValidator.ValidationEngineType.Structure, True) 
       End SyncLock 

UND:

SyncLock thisLock 
         record.FileData.Seek(0, SeekOrigin.Begin) 
         cellValue = excelUtility.GetCellFormulaValue(record.FileData, sheetNo, GetConfigSetting(GenericConfigSection.VALIDATION_CELL_RANGE_NAME), fileName) 
        End SyncLock 

jedoch seine nicht funktioniert. Liegt es daran, dass jeder Thread eine eigene Instanz von UploadController() erstellt und daher mehrere Sperren gibt?

Antwort

0

Beim weiteren Lesen der folgenden: https://msdn.microsoft.com/en-us/library/3a86s51t.aspx

Insbesondere die folgenden:

Geschützte Daten. Wenn lockobject eine Shared-Variable ist, verhindert die exklusive -Sperre, dass ein Thread in einer Instanz der Klasse den SyncLock-Block ausführt, während ein anderer Thread ihn ausführt. Dies schützt Daten, die unter allen Instanzen geteilt wird.

Wenn LockObject ist eine Instanzvariable (nicht geteilt), verhindert die Sperre ein Thread in der aktuellen Instanz läuft, wie aus dem anderen Thread in der gleichen Instanz zugleich SyncLock Block ausgeführt wird. Diese schützt Daten, die von der einzelnen Instanz gepflegt werden.

Als Ergebnis habe ich meine Sperre für die Freigabe geändert. Das scheint mein Problem gelöst zu haben.

+0

Während dies funktioniert, kompilieren, nicht Fehler werfen. Ich würde Sie ermutigen, Performance-Profiling mit relevanten Daten durchzuführen, für die Sie die Parallelität festlegen. Ich sage das, weil es für mich aussieht, als ob ein großer Teil Ihres parallelen Codes blockiert wird und auf die Thread-Synchronisation wartet. Gibt die Dokumentation der Klasse an, dass sie Instanzen freigegeben hat, die nicht threadsicher sind? Oder dass eine einzelne Instanz der Klasse nicht Thread-sicher ist? Wenn es der zweite ist, können Sie möglicherweise keine Sperren verwenden und die volle Stärke Ihrer Parallelität nutzen. – davidallyoung

+0

Danke David. Die Dokumentation ist nicht sehr detailliert. Es erwähnt nur, dass es nicht threadsicher ist. Ich testete ohne die Schlösser und die Ergebnisse waren unvorhersehbar. Aber nachdem ich die Sperren implementiert hatte, war ich in der Lage, mit großen Datenmengen zu testen, und die Ergebnisse waren gut und berechenbar und haben trotzdem merkliche Leistungsgewinne gegenüber dem Single-Thread-Ansatz. – Fiona

Verwandte Themen