Alternative zu MessageQueue innerhalb von Threads



  • Hallo!

    Ich hab da mal eine kleine Frage zu Kommunikation innerhalb von Threads mit Hilfe von Message Queues oder Alternativen.

    Und zwar habe ich eine main()-Methode, die ihrerseits einige Threads startet. Nennen wir sie mal A, B, C und D. Die main()-Methode soll jetzt nichts anderes machen, als Befehle aus den einzelnen Threads zu empfangen und diese dann zu bearbeiten.

    Gelöst ist das momentan so, dass in der main() eine MessageQueue aufgemacht wird und in den vier Threads Nachrichten in diese MQ geschrieben werden. Die main() holt dann Nachricht für Nachricht über ein msgrcv() ab und wertet die Aktion aus.

    Das funktionierte bisher alles ganz gut. Jetzt ist es aber wohl so, dass von den einzelnen Thread sehr viele Daten kommen (ca. 256 Nachrichten alle 60ms) irgendwie die Queue nicht mehr hinterher kommt.

    Würde es Sinn machen diese Kommunikation über einen UNIX-Socket zu realisieren? Dann müsste man halt irgendwie aus jedem Thread heraus ein connect() machen. Aber das würde bedeuten, das ich in jedem Thread einen Clientsocket erstellen muss, oder?

    Alternativ wäre auch eine 3-Message-Queue Lösung eine Idee, oder? Aber ich kann in der main() ja nur einmal mit einem msgrcv blockierend warten, also kein msgrcv(1)||msgrcv(2) usw machen.

    Gruß
    Thorsten



  • Ich bin zu blöd... habe da gerade mal was probiert und bekomme beim sendto() immer nur ein "Operation not supported". Der Code sieht ganz grob so aus:

    id = socket(PF_UNIX, SOCK_STREAM, 0);
    
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, "/tmp/test.sock", sizeof("/tmp/test.sock"));
    addrlen= sizeof(addr.sun_family)+strlen(addr.sun_path);
    bind(id, (sockaddr*)addr, addrlen);
    
    ..
    mb.sender = 99;
    mb.port = 5000;
    
    sendto(id, &mb, sizeof(mb), 0, (sockaddr*)addr, addrlen);
    recvfrom(...);
    

    So, und bei sendto() kommt jetzt immer als Rückgabewert ein EOPNOTSUPP (Operation not supported). Ich versteh nur nicht wieso.

    Problem ist halt, ich bin Server und Client in einem Prozess. Eigentlich würde ich da noch ein listen() und ein accept() vor das sendto() packen, aber das accept() wartet ja auf einen Client.... ein Henne-Ei-Problem.

    Oder übersehe ich da was?

    Gruß
    Thorsten


Anmelden zum Antworten