Precise thread sleep needed. Max 1ms error
From the question tags I suppose you are on windows.
Take a look at Multimedia Timers, they advertise precision under 1ms.
Another options is to use Spin Locks but this will basically keep a cpu core at maximum usage.
Accurate Sleep with cancellation
You shouldn't be implementing this at all.
In C++11 all basic necessary utilities for multithreading are implemented in the standard.
If you do not use C++11 - then switch to C++11 or higher - in the unfortunate case that you cannot, then use Boost which has the same features.
Basically, what you want to do with this functionality is covered by std::condition_variable
. You can put a thread into waiting mode by using function wait
(it accepts a condition function necessary for leaving the wait), wait_for
and wait_until
(same as wait
but with total waiting time limit) as well as notify_one
and notify_all
methods that wake the sleeping threads (one or all) and make them check the awakening condition and proceed with their tasks.
Check out std::conditional_variable
in the reference. Just google it and you'll find enough information about it with examples.
In case you do not trust std::conditional_variable
implementation for some reason, you can still utilize it for mini waits and awakening.
What Thread sleep method is most precise: Monitor.Wait vs System.Timer vs DispatchTimer vs Threading.Timer
I have never actually used them myself, but Multimedia Timers are said to have the best resolution of any timer service in Windows. The .NET BCL does not have a wrapper for this timer service yet so you will have to do the P/Invoke calls yourself.
Another option might be to use Stopwatch
together with some standard Thread.Sleep
calls in a tight loop. I am not sure how much luck you would have with this approach, but it might be more accurate than a plain old Thread.Sleep
call by itself. I have never tried it, but anything is worth a shot I suppose.
I did some experiments and I discovered that changing the thread priority to ThreadPriority.Highest
made a considerable difference. It reduced the standard deviation of the interval by quite a bit on each technique I tried.
What Thread sleep method is most precise: Monitor.Wait vs System.Timer vs DispatchTimer vs Threading.Timer
I have never actually used them myself, but Multimedia Timers are said to have the best resolution of any timer service in Windows. The .NET BCL does not have a wrapper for this timer service yet so you will have to do the P/Invoke calls yourself.
Another option might be to use Stopwatch
together with some standard Thread.Sleep
calls in a tight loop. I am not sure how much luck you would have with this approach, but it might be more accurate than a plain old Thread.Sleep
call by itself. I have never tried it, but anything is worth a shot I suppose.
I did some experiments and I discovered that changing the thread priority to ThreadPriority.Highest
made a considerable difference. It reduced the standard deviation of the interval by quite a bit on each technique I tried.
Related Topics
Scope of Exception Object in C++
Detecting Constexpr with Sfinae
Value Initialization and Non Pod Types
Mixing Debug and Release Library/Binary - Bad Practice
Properly Print Utf8 Characters in Windows Console
Error: Expected Class-Name Before '{' Token
How to Use Setprecision in C++
How to Compose Output Streams, So Output Goes Multiple Places at Once
Createfile: Direct Write Operation to Raw Disk "Access Is Denied" - Vista, Win7
Why Does "Extern Const Int N;" Not Work as Expected
Explicit Specialization in Non-Namespace Scope Does Not Compile in Gcc
Are Memory Leaks "Undefined Behavior" Class Problem in C++
Cpp - Valgrind - Invalid Read of Size 8
Convert Between String, U16String & U32String
Why Are Memcpy() and Memmove() Faster Than Pointer Increments