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

Могу ли я предположить, что функция 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
  • Новые материалы

    Как ИИ меняет сельское хозяйство
    Прочтите Статью Кэтлин Уолч в Forbes о том, как ИИ меняет сельское хозяйство . Сельское хозяйство и земледелие - одна из древнейших и важнейших профессий в мире. Человечество прошло долгий..

    Slack: проектирование современных интерфейсов человека и ИИ
    Когда Стюарт Баттерфилд выделил Slack из быстро исчезающей онлайн-игры Tiny Speck, его перспективы были в лучшем случае неопределенными. Существовал очевидный спрос на средства связи на рабочем..

    HTTP1.1 против HTTP2
    Http расшифровывается как HyperText Transfer Protocol, это в основном метод, который компьютеры и серверы используют для запроса и отправки информации. HTTP1.1 - это более старая версия Http, а..

    Радость вырезания
    Радость фрагментов По какой-то причине, когда я начал программировать в колледже, я активно сопротивлялся целому ряду земных благ, которые сделали бы мою жизнь чуточку удобнее. Я в основном..

    Создайте стройный слайдер с нуля без каких-либо внешних инструментов
    Слишком долго я полагался на сторонние плагины и инструменты для простых слайдеров. Пока в один прекрасный день в моей крошечной голове не загорелась лампочка, которую я могу сделать..

    Буферы протоколов, часть 01: соглашения об именах и файловая организация
    Если вам нравится читать статьи на Medium и вы заинтересованы в том, чтобы стать участником, я буду рад поделиться с вами своей реферальной ссылкой!

    Наши партнеры
    Globex SCI — уникальная система, которая хранит и позволяет использовать большие базы данных, опубликованные в блокчейне. Используя алгоритмы глубокого обучения и ИИ, мы можем прогнозировать..