2010-12-10 4 views
7

Im mit TClientSocket oder indy's TIdTCPClient (je nach Projekt)Können Threads denselben Client-Socket verwenden?

Ich habe ein paar Threads jeder Verarbeitung von Elementen, und manchmal müssen Daten über den angeschlossenen Client-Socket senden. (Data Read bildet die Buchse sind nicht in den Verarbeitungs-Threads verwendet)

Im Grunde ist meine Frage ...

  • das möglich ist?
  • ist es "sicher"?

oder soll ich

  • habe einen Client-Socket pro Faden oder
  • einig irgendwie von Marshalling/kritischen Abschnitten

Delphi-7 indy-9

+1

BTW, Indy 9.x ist veraltet –

+0

yeh ich weiß, (irgendwie Delphi 7 auch ich denke) es auf der "Liste" der Dinge zu tun;) –

Antwort

4

Mehrere Threads kann auf dieselbe Buchse lesen und schreiben. Da Sie jedes Mal, wenn Sie accept sind, die erste Verbindung in der Warteschlange ausstehender Verbindungen extrahieren, einen neuen Socket mit denselben Socket-Eigenschaften erstellen und einen neuen Dateideskriptor für diesen Socket zuweisen.

Also nur ein Thread pro angenommene Verbindung.

Wenn Sie fragen, ob Sie mehrere Schreib-/Lesevorgänge für eine akzeptierte Verbindung ausführen können, benötigen Sie Sperrfunktionen, wodurch die Vorteile des Parallelismus verloren gehen. Wenn Sie einen langen Prozess fädeln und dann das Ergebnis in den Socket schreiben möchten, verwenden Sie die Synchronisation, um in der richtigen Reihenfolge zu schreiben.

+0

Danke dafür, fand auch das, die geholfen http: // tangentsoft.net/wskfaq/intermediate.html#threadsafety –

+0

Außerdem ist 'accept' thread-safe :) –