Alternative zu Sleep()



  • Knerbel schrieb:

    Guten Abend,

    ich habe folgendes Problem: Der Compiler (Dev C++ 4.992) erkennt zwar die Funktion sleep(), doch diese wird nicht ausgeführt, das heißt, der jeweilige Thread wird ab dieser Funktion nicht weiter ausgeführt.

    Klingt aber genau nach dem, was sleep tun soll.

    Haste evtl eine Vorlage gehabt, die
    Sleep(1000);//schlafe 1000 Millisekunden == 1 Sekunde
    macht und übersetzt zu
    sleep(1000);//schlafe 1000 Sekunden == ca 20 Minütchen



  • C kann seit C11 sehr wohl threaden. Ob das von deinem Toolset welches von DevSchrott++ mitgeliefert wurde unterstützt wird ist eine andere Frage 😉
    Der aktuelle gcc kann das, du könntest also das vorinstallierte von DevC++ einfach updaten, sofern auch MinGW C11 unterstützt. Oder eine moderne IDE benutzen wie CodeBlocks oder VisualStudio benutzen, wobei ich deren C11 Stand nicht weiß.
    Wenn du unter windows unterwegs bist, kannst du auch Sleep() aus windows.h benutzen.



  • roflo schrieb:

    Oder eine moderne IDE benutzen wie CodeBlocks oder VisualStudio benutzen, wobei ich deren C11 Stand nicht weiß.

    Also Code::Blocks 13.12 unterstützt es nicht, Dev-c++ auch nicht, haben beide unter Windows MinGW mitgeliefert.


  • Mod

    Bitmapper schrieb:

    roflo schrieb:

    Oder eine moderne IDE benutzen wie CodeBlocks oder VisualStudio benutzen, wobei ich deren C11 Stand nicht weiß.

    Also Code::Blocks 13.12 unterstützt es nicht, Dev-c++ auch nicht, haben beide unter Windows MinGW mitgeliefert.

    Es nutzt ohnehin niemand ernsthaft die C11-Threads. Der Threadersteller garantiert auch nicht. Das ist kein Ausschlusskriterium.



  • Ich fasse mal zusammen:

    /* WinAPI, nicht threadsafe */
    #include <windows.h>
    VOID WINAPI Sleep(DWORD dwMilliseconds);
    
    /* POSIX, threadsafe */
    #include <unistd.h>
    unsigned sleep(unsigned seconds);
    
    /* POSIX aber deprecated, NICHT reentrant/threadsafe */
    #include <unistd.h>
    int usleep(useconds_t useconds);
    
    /* POSIX, threadsafe */
    #include <time.h>
    int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
    
    /* ANSI C, busy-loop! */
    void sleep( unsigned long waitms )
    {
       clock_t goal;
       goal = (double)CLOCKS_PER_SEC*waitms/1000. + clock();
       while( goal > clock() ) ;
    }
    

    http://ideone.com/B6vtT0



  • @Wutz
    Was soll "nicht threadsafe" bei ner Sleep-Funktion heissen?

    Und wenn es heissen soll was ich meine, wie zum Geier kommst du dann darauf dass Sleep(DWORD) von Windows nicht threadsafe wäre? Natürlich ist das threadsafe!



  • Nicht threadsafe heißt nicht threadsafe gemäß POSIX-Doku.
    Trolle woanders rum aber nicht bei mir.



  • Da fühlt sich jamend wieder cool.



  • Wutz schrieb:

    Nicht threadsafe heißt nicht threadsafe gemäß POSIX-Doku.
    Trolle woanders rum aber nicht bei mir.

    Um, du willst uns hier aber nicht ernsthaft erzählen, dass man einen Aufruf von Sleep() oder usleep() in eine Critical Section packen muss, oder!?



  • Ich denke mal es geht darum, was passiert, wenn ein signal dazwischenfunkt: http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html



  • roflo schrieb:

    Ich denke mal es geht darum, was passiert, wenn ein signal dazwischenfunkt: http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html

    I see, nachdem ich nie was mit POSIX zu tun hab, war mir nicht bewusst, dass usleep() so kaputt ist. Win32 Sleep() ist aber auf jeden Fall threadsafe, wie man überhaupt auf die Idee kommen kann, dass das anders sein könnte, ist mir ehrlich ein Rätsel...


Anmelden zum Antworten