Хобрук: Ваш путь к мастерству в программировании

Могу ли я предположить, что функция Delphi NOW будет потокобезопасной?

Если я вызываю СЕЙЧАС из нескольких потоков, могу ли я предположить, что это нормально, или мне нужно реализовать блокировку для этого? Я знаю, что форматирование даты и времени небезопасно, но как насчет чтения даты и времени? Кроме того, как насчет QueryPerformanceCounter? Я просмотрел, но не могу найти исчерпывающую документацию по безопасности потоков для этих низкоуровневых функций.


  • Теперь потокобезопасно. Форматирование даты также, если вы делаете это правильно. QueryPerformanceCounter также является потокобезопасным. Windows API является потокобезопасным. 29.11.2012
  • Документация должна предупреждать вас, когда функция API НЕ является потокобезопасной. В настоящее время функции по умолчанию являются потокобезопасными. 29.11.2012
  • Правильное форматирование даты означает использование версий функций, которые принимают параметр TFormatSettings. 29.11.2012
  • Или вызов функций, которые не получают параметров и никогда не меняют глобальную переменную FormatSettings (если она так называется) 29.11.2012
  • Это не является потокобезопасным, поскольку другие функции могут по-прежнему изменять глобальные настройки, пока эта функция их использует. 29.11.2012
  • @Golez Именно это я и сказал. Пока вы никогда не изменяете эти общие данные, они потокобезопасны. 29.11.2012
  • Спасибо Дэвиду, Марьяну и Сергу за исчерпывающее сообщение. В настоящее время функции по умолчанию являются потокобезопасными. 29.11.2012

Ответы:


1

У вас есть доступ к SysUtils.pas? У меня есть мои старые исходники Delphi4, а в Source\Rtl\Sys\SysUtils.pas есть реализация Now(). Кажется, он использует Win API GetLocalTime() и собственные функции EncodeDate() и EncodeTime(). Все они потокобезопасны, поэтому Now() также является потокобезопасным.

29.11.2012
  • вызов потокобезопасных функций в теле функции - a(); б(); Результат := с(); все еще может быть небезопасным для потоков кодом 29.11.2012
  • Да, но Now() использует только свои собственные переменные и побочных эффектов быть не должно. 29.11.2012
  • @Михал - Интересно, да. У меня есть собственное «Сейчас», которое вызывает QueryPerformanceCounter для получения TDateTime с разрешением 100 нс, так что да, применим безопасный вывод «его потокобезопасный». 29.11.2012
  • TDateTime имеет точность только в миллисекундах, так зачем использовать QPC (который, как известно, НЕ безопасен в многопроцессорной среде, BTW) для получения значений даты/времени с наносекундным разрешением? 29.11.2012
  • @RemyLebeau QPC дает нам аппаратные импульсы и длительность в микросекундах, и если вы проведете некоторое тестирование, TDateTime, который является двойным BTW, может удерживать это разрешение. Это функции Now и GetTickCount с разрешением 1 мс. 30.11.2012
  • Но ничто в RTL на самом деле не использует микросекунды, даже если TDateTime может их физически удерживать. 30.11.2012
  • Известно, что API QPC/QPF дает ненадежные результаты для некоторых систем из-за ошибок набора микросхем. Операционные системы пытаются использовать аппаратные таймеры и обеспечивать надежную синхронизацию, но это не всегда возможно. 30.11.2012
  • @Remy Нет, это правда, но у меня есть свои собственные подпрограммы для этого DelayMicroseconds (AValue: integer) и т. д. Из интереса, проверив мои предыдущие исследования, я вижу, что TDateTime (double) имеет разрешение примерно 7,3E-12, то есть около 8 пс. используя типичные современные даты. «Смежные» значения сегодня составляют 4,12454337469792E+004 и 4,12454337469792E+004, что составляет 7,27595761418343E-012 друг от друга. 02.12.2012
  • Новые материалы

    Изучите Vue перед React. Вот почему
    Сегодняшняя сеть представляет собой запутанный беспорядок из разных языков, библиотек и фреймворков, и начинающие веб-разработчики часто не могут понять, что изучать в первую очередь. Что вы..

    Гл.31 — Помощь слабослышащим с помощью возможностей машинного обучения Apple Watch.
    1 500 000 000  – количество людей с потерей слуха в мире. Это почти 20% населения Земли! (источник: who.int ) Недавно я экспериментировал с Apple Sound Classification API, и результаты на..

    Машинное обучение без кода / Глубокое обучение Каждый специалист по обработке и анализу данных должен знать
    Akkio, Очевидно.ай, DataRobot, Левити, Clarifai, Teachable Machines, Lobe, Pimer, DynaBench, APAflow Teachable Machine- https://teachablemachine.withgoogle.com/ Vertex AI..

    Код, который работает вместе, остается вместе
    Первоначально это было опубликовано в tiagojdf . Когда я только начинал как младший программист, я всегда терялся, глядя на внутренний код. Я предположил, что отчасти это было из-за того,..

    Эта модель Google сочетает в себе рассуждение и действие в рамках одной языковой модели.
    ReAct предоставляет архитектуру, которая инициирует действия на основе путей рассуждений языка. Недавно я запустил образовательный информационный бюллетень, посвященный ИИ, у которого уже..

    Сортировка структур JSON по нескольким полям в JavaScript
    Array.sort() не для слабонервных. Особенно, когда речь идет о сортировке сложных структур данных. Большинство руководств по JavaScript дают только краткое введение в Array.sort() . Обычно..

    Иллюзии разработки программного обеспечения
    Многие вещи не то, чем кажутся Реальность — это всего лишь иллюзия, хотя и очень настойчивая. Альберт Эйнштейн Разработка программного обеспечения никогда не бывает такой, какой кажется...