while(other_thread_is_busy); ohne die CPU zu belasten



  • So einfach ist das hier leider nicht. Beide Threads laufen quasi ewig, wobei Thread A ab und an ein paar Daten in einen Puffer schreibt und Threads B darauf wartet, um diese dann weiter verarbeiten.



  • ok. dann sind mutexes doch die bessere wahl, sorry 😛

    edit:

    boost::mutex _mutex;
    
    boost::mutex::scoped_lock lock(_mutex);
    

    ?

    edit 2:
    oder oldschool

    #if defined(_WIN32)
      HANDLE          Mutex = NULL;
      Mutex = CreateMutex(NULL, FALSE, NULL);
    #else
      pthread_mutex_t* Mutex = NULL;
      pthread_mutex_init(Mutex, NULL);
    #endif
    
    #if defined(_WIN32)
      WaitForSingleObject(Mutex, INFINITE);
    #else
      pthread_mutex_lock(Mutex);
    #endif
    
    #if defined(_WIN32)
      ReleaseMutex(Mutex);
    #else
      pthread_mutex_unlock(Mutex);
    #endif
    

    😃





  • Äh.
    "while (!condition) wait();" -> condition variable.



  • [quote="sothis_"]

    #if defined(_WIN32)
      HANDLE          Mutex = NULL;
      Mutex = CreateMutex(NULL, FALSE, NULL);
    #else
    ...
    

    mutexe unter win sind zwar gut wenn man verschiedene prozesse synchronisieren will, für threads innerhalb eines prozesses sind nach der landläufigen meinung 'critical sections' besser geeignet (schneller).
    🙂



  • hustbaer schrieb:

    "while (!condition) wait();" -> condition variable.

    Was hat jetzt man: wait(2) damit zu tun? 😕



  • Earthy schrieb:

    hustbaer schrieb:

    "while (!condition) wait();" -> condition variable.

    Was hat jetzt man: wait(2) damit zu tun? 😕

    Nichts. Was gleich die Frage aufwirft: was soll das sinnfreie Posting?



  • hustbaer schrieb:

    Earthy schrieb:

    hustbaer schrieb:

    "while (!condition) wait();" -> condition variable.

    Was hat jetzt man: wait(2) damit zu tun? 😕

    Nichts. Was gleich die Frage aufwirft: was soll das sinnfreie Posting?

    Dasselbe könnte ich dich fragen, da wait() ja offenbar nichts mit meiner Frage zu tun hat.

    BTW: Ich hab mich jetzt für den von sothis_ vorgeschlagenen oldschool-Weg entschieden, da es offenbar nichts besseres gibt.



  • Ok, du hast mich nicht verstanden.
    "while (!condition) wait();" ist als pseude-code zu verstehen, und soll heissen: "solange bedingung X nicht zutrifft warten". Du hast im Kopfposting selbst "while(other_thread_is_busy);" geschrieben - was genau dasselbe ist.

    Also warten solange bis nichtmehr "other thread is busy". Und genau das macht man mit condition variablen.
    Das ist die "beste Lösung".

    Ein Herumgemurkse mit Mutexen alleine wird dich nicht sehr weit bringen.

    BTW: Ich hab mich jetzt für den von sothis_ vorgeschlagenen oldschool-Weg entschieden, da es offenbar nichts besseres gibt.

    Tu was du meinst dass richtig ist. Dass es "nix besseres gibt" ist allerdings nicht wahr.



  • hustbaer schrieb:

    Ok, du hast mich nicht verstanden.
    "while (!condition) wait();" ist als pseude-code zu verstehen, und soll heissen: "solange bedingung X nicht zutrifft warten". Du hast im Kopfposting selbst "while(other_thread_is_busy);" geschrieben - was genau dasselbe ist.

    Achso. Jetzt verstehe ich, was du meinst. Ich war etwas verwirrt, da ich wait() aus einem anderen Kontext her kannte.

    hustbaer schrieb:

    Also warten solange bis nichtmehr "other thread is busy". Und genau das macht man mit condition variablen.
    Das ist die "beste Lösung".

    Ich habe mal nach "condition variables" gegooglet und dies gefunden: http://www.cs.wustl.edu/~schmidt/win32-cv-1.html Das ist ganz interessant. Aber eine passende cross-platform Library wäre mir natürlich lieber, bevor ich mir selber etwa zusammen bastle. Kennst du da zufällig etwas?

    hustbaer schrieb:

    Ein Herumgemurkse mit Mutexen alleine wird dich nicht sehr weit bringen.

    Naja, es hat ja mit den Mutexen wunderbar funktioniert, mich hatte halt nur gestört, dass es nicht portabel war und dass Mutexe eigentlich nicht dazu gedacht waren.



  • boost::thread hat condition variables:
    http://www.boost.org/doc/html/boost/condition.html


Anmelden zum Antworten