Thread pausieren, wieder fortsetzen und pausiert starten



  • Gibt es POSIX-Funktionen, mit denen man keinen Thread anhand seiner ID:
    a) anhalten
    b) wieder fortsetzen
    kann?
    Desweiteren: ist es möglich einen Thread pausiert zu starten, damit man erst "noch was erledigen" kann und ihn dann startet?



  • Nein, solche Funktionen gibt es nicht. Was möchtest du denn erreichen?
    Denn meistens braucht man diese Funktionalität gar nicht, wenn man das Programm vernünftig designt.



  • Pausieren: Server-Hauptthread anhalten
    Wiederfortsetzen: den Selbigen wieder weiterlaufen lassen
    Pausiert starten: bei Annahme einer Verbindung wird die Thread-ID als Index-Key für eine Map benutzt. Die ID hab ich ja aber erst, wenn der Thread bereits läuft und so greift er schneller auf die Map zu, als der Eintrag gemacht wurde.



  • Dr. C++ schrieb:

    Pausieren: Server-Hauptthread anhalten
    Wiederfortsetzen: den Selbigen wieder weiterlaufen lassen
    Pausiert starten: bei Annahme einer Verbindung wird die Thread-ID als Index-Key für eine Map benutzt. Die ID hab ich ja aber erst, wenn der Thread bereits läuft und so greift er schneller auf die Map zu, als der Eintrag gemacht wurde.

    Was macht der Hauptthread? Wozu möchte man diesen anhalten?

    Pausiert starten:

    Du kannst doch die ID für einen neuen Thread erzeugen, bevor dieser startet. Diese ID übergibst du dann dem Thread. Das hat auch den Vorteil, dass du ein std::vector benutzen kannst und nicht auf std::map angewiesen bist.

    Wie kommst du überhaupt an die ID des neuen Threads?



  • Der Hauptthread eines Servers nimmt logischerweise neue Verbindungen entgegen. Und wie, bitteschön, soll ich an die Thread-ID kommen, bevor er erzeugt wurde?! (ich nehm pthread_t als Index-Key)



  • Dr. C++ schrieb:

    Der Hauptthread eines Servers nimmt logischerweise neue Verbindungen entgegen. Und wie, bitteschön, soll ich an die Thread-ID kommen, bevor er erzeugt wurde?! (ich nehm pthread_t als Index-Key)

    Wenn der Hauptthread neue Verbindung annimmt, dann wartet der automatisch auf diese, wenn es nichts zu tun gibt, oder nicht?

    Du kannst es so machen:

    pthrad_mutex_t map_mutex = PTHREAD_MUTEX_INITIALIZER;
    std::map<int, Data *> map;
    
    extern "C" void * start_func(void * arg) {
       Data * data = static_cast<Data *>(arg);
       pthread_mutex_lock(&map_mutex);
       map[phtread_self()] = data;
       pthread_mutex_unlock(&map_mutex);
       ...
    }
    
    Im Hauptprogramm:
    
    ...
    Data * data = new Data(....);
    ...
    pthread_create(&tid, NULL, start_func, data);
    ...
    


  • Sorry, dass ich vergessen hab, das zu sagen: ich arbeite mit Klassen. Das mitgegebene Argument für den Thread brauch ich um wieder in die Serverklasse zurückzukommen. Damit funktioniert der Code leider nicht 😞 .



  • Dr. C++ schrieb:

    Sorry, dass ich vergessen hab, das zu sagen: ich arbeite mit Klassen. Das mitgegebene Argument für den Thread brauch ich um wieder in die Serverklasse zurückzukommen. Damit funktioniert der Code leider nicht 😞 .

    Dann leg einfach eine neue Klasse an:

    struct ThreadData {
    void * anything;
    Data * data;
    };

    Und gib einen Zeiger auf ein solches Element weiter. Dann kannst du den bisherigen Wert in anything speichern.


Anmelden zum Antworten