Diamo il seguente pezzo di codice, che semplicemente misura la durata del std::this_thread::sleep_for
chiamato con 20ms: std :: :: this_thread sleep_for posti letto più breve del previsto in VS2015
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;
using namespace std::chrono;
int main()
{
for (int i = 0; i < 20; i++)
{
auto start = steady_clock::now();
this_thread::sleep_for(milliseconds(20));
auto end = steady_clock::now();
duration<double, milli> elapsed = end - start;
cout << "Waited " << elapsed.count() << " ms\n";
}
}
Quando condotta secondo compilato con set di strumenti V120 (VS2013 di) ottengo risultati come previsto, vale a dire:
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
Waited 20.0025 ms
Waited 20.0025 ms
Waited 20.0026 ms
ma quando eseguito con V140 set di strumenti di VS2015, i risultati sono un po 'sorprendente e non rispettano la promessa sia da msdn e cppreference.com 01.237.837,855 miladescrizioni (che sleep_for
blocca l'esecuzione del thread corrente per almeno specificato sleep_duration
). Essi sono i seguenti:
Waited 19.7793 ms
Waited 19.9415 ms
Waited 19.6056 ms
Waited 19.9687 ms
Waited 19.608 ms
Waited 19.589 ms
Waited 20.5435 ms
Waited 19.5669 ms
Waited 19.6802 ms
Waited 19.5381 ms
Come il suo possibile e come posso fare di VS2015 sleep_for
a dormire almeno fino a come previsto?
saluti, Dawid
EDIT:
come richiesto quelle sono le mie impostazioni e le informazioni del sistema operativo:
OS:
Windows 7 Professional 64bit
Studios visivi: 2010 Ultimate 2013 della Comunità, 2015 Professional con Update 1
impostazioni del compilatore:
impostazioni predefinite per applicazione console Win32,
qualsiasi debug e Release configurazioni,
uno qualsiasi di x86 e x64 target platform archit ectures
Generalmente uso 'sleep_until()' in un ciclo in caso di sveglia anticipata. Penso che il risveglio anticipato non dovrebbe accadere, ma su GCC Linux, almeno, il risveglio anticipato sembra avvenire ogni volta che il processo riceve un segnale (ovviamente non è il tuo problema qui). – Galik
Non vedo gli stessi risultati localmente o ad es. su http://rextester.com/l/cpp_online_compiler_visual (utilizza anche VS2015). Prendi in considerazione l'aggiunta di ulteriori informazioni sulle esatte impostazioni del compilatore, l'architettura di destinazione, il sistema operativo host, le specifiche della macchina, ecc. – Yirkha
@Yirkha: ho aggiunto ulteriori dettagli sulle mie condizioni nella descrizione. Per quanto riguarda i risultati ottenuti, sembrerà che citi piccole differenze nel mio sistema. – dawid