Рассмотрим следующий фрагмент кода
#include <chrono>
#include <iostream>
#include <thread>
int main()
{
using std::chrono::system_clock;
using std::chrono::milliseconds;
using std::chrono::nanoseconds;
using std::chrono::duration_cast;
const auto duration = milliseconds(100);
const auto start = system_clock::now();
std::this_thread::sleep_for(duration);
const auto stop = system_clock::now();
const auto d_correct = duration_cast<nanoseconds>(duration).count();
const auto d_actual = duration_cast<nanoseconds>(stop - start).count();
std::cout << "Difference is " << d_actual << ", and it should be roughly " << d_correct << "\n";
}
Что мы ожидаем, это что-то в строке
Разница составляет 100039989, и она должна быть примерно 100000000
Смотрите эту демонстрацию, где она работает абсолютно нормально.
Однако на моей машине установлено несколько компиляторов, которые, по-видимому, вызывают несогласованность в соответствии с этим ответом здесь, в разделе Переполнение стека.
Поэтому я попробовал исправить исправление: Установка правильного LD_LIBRARY_PATH
.
Это комбинации с результатами, которые я пробовал (среди прочего, с 4.4 и 4.6...)
g++-4.7 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.7/ ./a.out
Разница равна 100126, и она должна быть примерно 100000000
g++-4.7 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.8/ ./a.out
Разница составляет 100132, и она должна быть примерно 100000000
g++-4.8 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.7/ ./a.out
Разница 100085953, и она должна быть примерно 100000000
g++-4.8 time.cpp -pthread -std=c++11; LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.8/ ./a.out
Разница равна 100156418, и она должна быть примерно 100000000
Кажется, что независимо от того, компиляция с g++-4.8
отлично работает с использованием любого из libstdc++
, а компиляция с g++-4.7
приводит к нарушенной ситуации.
Неужели я делаю что-то не так в компиляторе/двоичном вызове или это ошибка в g++-4.7
? (It g++-4.7.3
и g++-4.8.1
, чтобы быть конкретным)
Для (вероятно, самого безобразного) обходного пути я могу, конечно, измерить в течение крошечного времени, сравнить его с ожидаемой разницей и придумать фактор. Однако я бы очень хотел, чтобы это было изящно.