2012-04-04 17 views
0

Verwenden von nicht threadsicheren Bibliotheken mit Threads. Angenommen, ich habe eine Bibliothek, die eine Verbindung zu einem Server herstellt. Und es ist nicht threadsicher. Kann ich die Bibliothek innerhalb von 2 Threads initiieren?nicht threadsichere Bibliotheken und Threads

dh:

thread_1(){ 
telnet_lib_t *connection1; 

while(1){ 
do_somestuff 
} 

free_telnet(connection1); 
} 

thread_2(){ 
telnet_lib_t *connection2; 

while(1){ 
    do_somestuff; 
} 

free_telnet(connection2); 
} 

Würde das funktionieren? Jetzt habe ich 2 unabhängige Instanzen der Bibliothek ausgeführt. Also würden sie sich nicht stören, oder?

+0

Sie können es in zwei Threads ausführen, aber es gibt wahrscheinlich nur eine Kopie der Bibliothek auf Ihrem Computer. Das bedeutet, dass die Aufrufe von einem der beiden Threads Probleme für Sie verursachen können. –

Antwort

1

Nein, das geht nicht. Wenn die Bibliothek keinen globalen Status hat und ihre Funktionen nur intern nicht threadsicher sind, könnten Sie das Problem lösen, indem Sie die gesamte Bibliothek durch einen Mutex schützen und nur einem Thread den Zugriff auf einen einzigen Thread erlauben. vor allem, wenn die Bibliothek langsame oder blockierende Aufgaben ausführt. Aber wenn die Bibliothek grundsätzlich einen singulären globalen Zustand hat und keine Möglichkeit zum Speichern/Wiederherstellen/Austauschen von Zuständen gibt, dann gibt es einfach keine Möglichkeit, sie in mehreren Threads zu verwenden (oder sogar mehrere Kontexte abwechselnd in einem Programm ohne Thread zu verwenden)). Solche Bibliotheken gelten im Allgemeinen als Müll und sollten ersetzt werden.

0

Es hängt davon ab, warum es nicht threadsicher ist.

Zum Beispiel, wenn die Bibliothek eine statische Variable verwendet, dann würde das immer noch zwischen zwei Threads geteilt werden.

Also, im Allgemeinen wäre dies eine schlechte Idee. Wenn etwas nicht threadsicher ist, verwende es nicht in Threads, aber du könntest einen Child-Prozess forkieren und dann verwenden, der schwerer ist als Threads, aber sicherer.

0

Ohne mehr über die Besonderheiten der nicht thread-sicheren Bibliothek zu wissen, ist es nicht möglich zu sagen, dass es sicher ist, wie Sie es vorschlagen.

Wenn die Bibliothek eine global freigegebene Ressource hat (z. B. eine globale Variable), könnten die beiden Threads gut aufeinander treten und diese globale Variable auf eine Weise überschreiben, die vom Bibliotheksschreiber nicht beabsichtigt ist.

Das Problem ist, kann keine Menge von Tests mit Sicherheit beweisen, dass Sie nicht schließlich einen Konflikt auslösen werden.

Wenn Sie die Bibliothek parallel verwenden müssen, ist die einzige sichere Möglichkeit, dies zu tun, Prozessisolation zu verwenden ... mehrere untergeordnete Prozesse erstellen, die jeweils eine Instanz der Bibliothek laden.

0

Sie können das nur tun, wenn Sie wissen, dass die telnet_lib_t und ihre Methoden nicht mit einem globalen Status funktionieren (d. H. Sie sind nicht auf globale Variablen angewiesen). Wenn Sie wissen, dass der Status der Bibliothek in sich selbst enthalten ist, verwenden Sie für sicher dann verwenden Sie es andernfalls nicht. Selbst wenn Sie während der Tests kein Problem feststellen, bedeutet das nicht, dass es kein Problem gibt, das irgendwo lauert.