0

I ProzessA einen Prozess haben, der 2 Gewinde ThreadA und ThreadB beginnt. Beide Threads senden und empfangen Daten von ProcessB mit dem gleichen Socket-Deskriptor.senden Recv auf einem Sockel von mehreren Threads

So im Wesentlichen:

int s; 

void thread_fnA(void*) 
{ 
    while(1) { 
     sendto(s); 
     recvfrom(s); 
    } 
} 

void thread_fnB(void*) 
{ 
    while(1) { 
     sendto(s); 
     recvfrom(s); 
    } 
} 

int main() 
{ 
     s = socket(AF_UNIX, SOCK_DGRAM, 0); 
     bind(s); 
     dispatch_thread(A); 
     dispatch_thread(B); 

} 

Gibt es eine Möglichkeit, dass die Nachricht von Thread B empfangen werden konnte in Gewinde A.

So Abfolge der Ereignisse empfangen werden:

Thread A bereitet eine Nachricht vor und ruft sendto() auf;

Thread B beginnt mit der Ausführung und bereitet eine Nachricht vor und ruft sendto() auf;

Thread B ruft recvfrom() gleichzeitig mit Gewinde A.

jedoch der Inhalt der Nachricht von beiden Threads erwarteten verschieden sind. Können die Nachrichten ausgetauscht werden, ThreadB bestimmte Nachricht von ThreadA empfangen werden.

Sollte das Senden und Empfangen in einigen Sperren beteiligt sein. (Mutex)

Antwort

1

Ich würde vorschlagen, ein anderes Design, in dem Sie eine einzigen-Thread, der das Senden und Empfangen und Nachrichtenwarteschlangen für die anderen Threads.

Wenn der Sende/Empfangs-Thread eine Nachricht empfängt, überprüft er, welche Art von Nachricht es ist, und zeigt sie an die (geschützte) Warteschlange des richtigen Verarbeitungsthreads an. Die Verarbeitungsthreads (Ihre aktuellen Schritte A und B) rufen die Nachrichten aus der jeweiligen Nachrichtenwarteschlange ab und verarbeiten die Nachrichten auf beliebige Weise. Wenn dann Thread A oder B eine Nachricht senden möchte, übergibt sie sie an den Sende/Empfangs-Thread unter Verwendung einer anderen Warteschlange, die der Sende/Empfangs-Thread abfragt.

Alternativ könnten die Verarbeitungsthreads (A und B in Ihrem Beispiel) direkt über den Socket senden. Oder jeder hat eine andere Buchse, die nur zum Senden verwendet wird.

+0

Sie meinen also, dass die Nachrichten falsch platziert werden können. – Haswell

+1

@Haswell Ja, es gibt eine Möglichkeit, dass es passieren wird. –

0

Da Sie den gleichen Socket in beiden Threads verwenden, ist es möglich, dass ein Thread die Nachricht liest, die für den anderen Thread bestimmt ist. Selbst wenn Sie Mutex verwenden, wäre das Design sehr schwierig. Sie können zwei Buchsen öffnen (oder auch Rohre):

  • Eine Buchse ist für die Kommunikation in der Richtung A> B
  • die zweite Buchse in der Richtung B-> A

Ein zweiter Möglichkeit besteht eine Steckdose mit einem Schreiber (Faden A) und einem Leser (Faden B). Wenn der Leser ein Datagramm empfängt, entscheidet er, vielleicht basierend auf Datagramm-Nutzinformationen, welche Aufgabe er zu erledigen hat. Oder es kann auch eine Aufgabe an andere Worker senden, die das Datagramm verarbeiten.

Verwandte Themen