Pausing in C++ - Which Method?

Viewed 2186

I've noticed two different ways to "pause" in C++. (Though I think the proper name for it is sleeping.)

Method 1, (probably the method most are familiar with):

#include <iostream>
#include <unistd.h>
int main() {
  std::cout<<"Hello, "<<std::endl;
  sleep(1);
  std::cout<<"world!\n";
  return 0;
}

And the method I learned first:

#include <iostream>
#include <thread>
#include <chrono>
int main() {
  std::cout<<"Hello, "<<std::endl;
  std::this_thread::sleep_for(std::chrono::seconds(1));
  std::cout<<"world!\n";
  return 0;
}

I'm not asking which way is right, (they both do the same thing), but rather I'm asking which is more used, or "accepted". Also, is there a difference between these two when it comes to things like speed/performance?

2 Answers

The difference between these two methods is the portability:

  • sleep from unistd.h is part of the C POSIX Library and therefore only available on Systems that provide the POSIX-API (e.g. Linux, BSD, ...) but for example not on Windows

  • std::this_thread::sleep_for is part of the C++ Standard Library (since C++11) and is therefore available on all platforms that support C++11 and newer

If you have the choice use std::this_thread::sleep_for to rely only on a C++11 implementation and not on the System API.

Primary differences:

  • std::this_thread::sleep_for is a standard function (since C++11). sleep is a POSIX standard function, and so is only available on systems that support POSIX.
  • The unit of the argument of sleep is seconds, while std::this_thread::sleep_for allows the use of any std::chrono::duration (although the clock used for measurement will have its own granlarity that may be less precise than the time that you specify).
  • The behaviour of std::this_thread::sleep_for is not defined in relation to signals that may interrput program flow. Typically, std::this_thread::sleep_for will be interrupted prematurely just like sleep would be, but there is no easy way of finding out how much time was left to sleep. sleep on the other hand returns the time left to sleep, so it is easy to deal with interruptions using a loop that sleeps until returned time to sleep is zero.
Related