Комбинированный форк pthread-win32
RedFox20 + Oktonion + WinBuild
Изменения PThread https://github.com/WinBuilds/pthread-win32:
Это форк версии 2.10.0.0 пакета pthreads-win32. ABI этого форка отличается от оригинала.
Сделанные изменения:
Тип счетчика повторного использования в ptw32_handle_t
был изменен с int
на size_t
, чтобы облегчить долговременную работу серверов.
Удалены неиспользуемые элементы из pthread_once_t
Эта библиотека часто тестируется с другими нашими проектами Visual Studio 2022.
Обычно я использую (и использовал) файлы проекта MSVC20xx для своей работы. Файлы Makefile используются гораздо реже и могут быть устаревшими.
Обратите внимание на сообщение о фиксации d4b0ef6b: хотя проект MSVC2022/2019 полностью настроен в соответствии с моими внутренними настройками, он может не подходить вашим.
Конечно, вы всегда можете отредактировать настройки вручную, но если вам нужно сделать это для многих файлов проекта vcxproj
, лучше всего написать сценарий. См. update-vcxproj.js
и patch-vcxproj.js
для примеров сценариев, которые делают подобные вещи. Я использую их, чтобы убедиться, что все мои проекты C/C++ имеют одинаковые настройки сборки, поэтому я не получаю никаких неприятных сюрпризов во время выполнения, потому что какой-то проект решил собрать с немного разными библиотеками времени выполнения отладки/выпуска статических/DLL, и т. д. и т. п.: миллионы способов получить ?? вашей системой сборки в среде Windows. Веселье! ?
(17 декабря 2021 г.)
Это микро-релиз, в основном содержащий административные исправления.
mkdir b && cd b && cmake -G "Visual Studio 16 2019" ..
: ОК. Это означает, что исправлено несколько скрытых ошибок, и мы включили обходной путь для дерьма CMake (мне все еще не нравится этот инструмент), когда исходные коды C должны быть условно скомпилированы как C++ (см. также pthread-EH.cpp). и pthread-JMP.c: два новых исходных файла оболочки). Это микровыпуск, содержащий в основном административные исправления.
Сборки MSVC и MinGW64 были протестированы на архитектуре SMP (Intel x64 Hex Core) путем выполнения включенного набора тестов, а также стресс-тестов и стендовых тестов.
Обязательно запускайте свои сборки с помощью набора тестов. Если вы видите сбои, подумайте, как ваши цепочки инструментов могут способствовать сбою. См. файл README для более подробного описания цепочек инструментов и систем тестирования, которые мы использовали для успешного прохождения тестов.
Мы рекомендуем MinGW64 вместо MinGW как для 64-, так и для 32-разрядных сборок GNU CC только потому, что обработка исключений MinGW DWARF2 в сборках C++ вызывает некоторые проблемы с отменой потоков.
MinGW64 также включает собственную реализацию pthreads, которую вы можете использовать. Если вы хотите создать нашу библиотеку, вам нужно будет выбрать опцию собственных потоков Win32 во время установки. Мы рекомендуем также выбрать метод обработки исключений SJLJ для сборок MinGW64-w32. Для сборок MinGW64-w64 должен работать метод обработки исключений SJLJ или SEH.
(08.08.2018)
Обратите внимание, что это новый основной выпуск. Увеличение основной версии вводит два изменения ABI, а также другие изменения в именах, которые потребуют перекомпиляции связываемых приложений и, возможно, некоторых текстовых изменений в ссылках на макросы времени компиляции в файлах конфигурации и исходных файлах, например, PTW32_* меняется на PTW32_ , ptw32_ на ptw32_* и т. д. .
С согласия всех существенных участников pthreads-win32 / pthreads4w версии 3, за исключением четырех файлов, выпускается на условиях лицензии Apache v2.0. APLv2 совместим с лицензиями GPLv3 и LGPLv3, поэтому этот код может по-прежнему законно включаться в проекты GPLv3 и LGPLv3.
Существенный значимый участник был определен как тот, кто внес оригинальный код, реализующий возможности, присутствующие в будущих выпусках. Сюда не входят несколько участников, которые предоставили устаревший код или предоставили исправления, исправляющие ошибки, реорганизующие код в эстетических или практических целях или улучшающие процессы сборки. Это различие было необходимо для того, чтобы двигаться вперед, учитывая вероятность того, что не со всеми участниками можно будет связаться. Все участники перечислены в файле CONTRIBUTORS.
Четыре файла, которые останутся LGPL, но будут изменены на версию 3, используются для настройки сборок среды GNU:
aclocal.m4
configure.ac
GNUmakefile.in
tests/GNUmakefile.in
Участниками, которые либо запросили это изменение, либо согласились с ним после консультации, являются:
Релизы pthreads-win32 / pthreads4w версии 2 останутся LGPL, но версия 2.11 и более поздние будут выпущены под v3 этой лицензии, так что любые дополнения к коду pthreads4w версии 3, перенесенному в v2, не будут загрязнять этот код.
Некоторые изменения, внесенные 26 февраля 2011 г., могут быть несовместимы с системами до Windows 2000.
Новые исправления ошибок во всех выпусках, начиная с 2.8.0, НЕ были применены к серии 1.xx.
Сборки MSVC, MinGW и MinGW64 были протестированы на архитектуре SMP (Intel x64 Hex Core) путем выполнения включенного набора тестов, а также стресс-тестов и стендовых тестов.
Обязательно запускайте свои сборки с помощью набора тестов. Если вы видите сбои, подумайте, как ваши цепочки инструментов могут способствовать сбою. См. файл README для более подробного описания цепочек инструментов и систем тестирования, которые мы использовали для успешного прохождения тестов.
Мы рекомендуем MinGW64 вместо MinGW как для 64-, так и для 32-разрядных сборок GNU CC только потому, что обработка исключений MinGW DWARF2 в сборках C++ вызывает некоторые проблемы с отменой потоков.
MinGW64 также включает собственную реализацию pthreads, которую вы можете использовать. Если вы хотите создать нашу библиотеку, вам нужно будет выбрать опцию собственных потоков Win32 во время установки. Мы рекомендуем также выбрать метод обработки исключений SJLJ для сборок MinGW64-w32. Для сборок MinGW64-w64 должен работать метод обработки исключений SJLJ или SEH.
За исключением следующего, этот выпуск функционально эквивалентен версии 2.11.0.
В этом выпуске представлены изменения в pthread_t и pthread_once_t, которые повлияют на приложения, связывающиеся с библиотекой.
pthread_t: остается структурой, но увеличивает счетчик повторного использования с 32 бит до 64 бит. На 64-битных машинах общий размер объекта не увеличится, мы просто эффективно используем 4 байта заполнения, уменьшая риск того, что счетчик может перевернуться в очень длительно работающих приложениях от небольшого до, по сути, нуля. 64-битный счетчик повторного использования увеличивает время безрисковой работы с месяцев (при условии, что среднее время жизни потока составляет 1 мс) до столетий (при условии, что среднее время жизни потока составляет 1 нс).
pthread_once_t: удаляет два давно устаревших элемента и уменьшает их размер.
(08.08.2018)
Новые исправления ошибок во всех выпусках, начиная с 2.8.0, НЕ были применены к серии 1.xx.
Некоторые изменения, внесенные 26 февраля 2011 г., могут быть несовместимы с системами до Windows 2000.
pthreads-win32 / pthreads4w версии 2.11 и все будущие версии 2.x будут выпускаться под лицензией Lesser GNU Public License версии 3 (LGPLv3).
Следующая основная версия этого программного обеспечения (версия 3) будет выпущена под лицензией Apache версии 2.0 (ALv2). Выпуск версии 2.11 под лицензией LGPLv3 позволит в дальнейшем перенести изменения версии 3 этого программного обеспечения в версию 2. В дополнение к этому, любые проекты GPL, в настоящее время использующие эту библиотеку, смогут продолжать использовать версию 2 или 3 этого кода в своих проектах.
Для получения дополнительной информации см.: https://www.apache.org/licenses/GPL-compatibility.html.
Чтобы соответствовать этому изменению, с этого момента модификации этой библиотеки будут приниматься только для версии 3 этого программного обеспечения в соответствии с условиями ALv2. Затем, при необходимости, они будут перенесены на версию 2.
Мы надеемся выпустить версию 3 одновременно с выпуском версии 2.11.
Эта версия была протестирована на архитектуре SMP (Intel x64 Hex Core) путем выполнения включенного набора тестов, а также стресс-тестов и стендовых тестов.
Обязательно запускайте свои сборки с помощью набора тестов. Если вы видите сбои, подумайте, как ваши цепочки инструментов могут способствовать сбою. См. файл README для более подробного описания цепочек инструментов и систем тестирования, которые мы использовали для успешного прохождения тестов. Мы рекомендуем MinGW64 вместо MinGW32 как для 64-, так и для 32-битных сборок GNU CC. MinGW64 также включает собственную независимую реализацию pthreads, которую вы можете использовать.
Для сборок набора инструментов Microsoft: (1) Для статического связывания требуется, чтобы и эта библиотека, и любые связывающие библиотеки или приложения были последовательно скомпилированы с /MT.
(2) Статические библиотеки были переименованы в libpthreadV*.lib, чтобы отличать их от библиотек импорта DLL pthreadV*.lib.
(3) Если вы используете смешанную связь, например, связываете статическую версию библиотеки /MT с приложением, связанным с /MD, вы можете использовать GetLastError() для запроса кода ошибки, поскольку библиотека устанавливает как errno (через _set_errno ()) и SetLastError().
Удалите попытку установить PTW32_USES_SEPARATE_CRT в заголовках, которая может привести к неожиданным результатам. В определенных ситуациях пользователь может захотеть явно определить его в своей среде, чтобы вызвать его эффекты либо при создании библиотеки, либо приложения, либо и того, и другого. См. README.NONPORTABLE. -- Росс Джонсон
Библиотека должна быть более надежной в полностью статически связанных сценариях. Примечание. Мы удалили код PIMAGE_TLS_CALLBACK и вернулись к более раннему методу, который кажется более надежным во всех выпусках компилятора.
Различные исправления в GNUmakefile. Хотя этот файл был удален, для полноты изменения были записаны как фиксации в репозитории.
MinGW64-w64 определяет pid_t как __int64. sched.h теперь отражает это.
Исправлено несколько тестов, которые проваливались на машинах под нагрузкой. В других тестах, в которых использовались аналогичные грубые механизмы синхронизации потоков (это модульные тесты), были применены такие же улучшения: semaphore5.c признает, что sem_destroy может законно возвращать EBUSY; mutex6*.c, mutex7*.c и mutex8*.c заменили одну функцию Sleep() циклом опроса.
(18 сентября 2016 г.)
Новые исправления ошибок во всех выпусках, начиная с 2.8.0, НЕ были применены к серии 1.xx.
Некоторые изменения, внесенные 26 февраля 2011 г., могут быть несовместимы с системами до Windows 2000.
Эта версия была протестирована на архитектуре SMP (Intel x64 Hex Core) путем выполнения включенного набора тестов, а также стресс-тестов и стендовых тестов.
Обязательно запускайте свои сборки с помощью набора тестов. Если вы видите сбои, подумайте, как ваши цепочки инструментов могут способствовать сбою. См. файл README для более подробного описания цепочек инструментов и систем тестирования, которые мы использовали для успешного прохождения тестов. Мы рекомендуем MinGW64 вместо MinGW32 как для 64-, так и для 32-битных сборок GNU CC. MinGW64 также включает собственную независимую реализацию pthreads, которую вы можете использовать.
Новые процедуры: pthread_timedjoin_np() pthread_tryjoin_np()
sched_getaffinity() sched_setaffinity() pthread_getaffinity_np() pthread_setaffinity_np() pthread_attr_getaffinity_np() pthread_attr_setaffinity_np()
pthread_getname_np() pthread_setname_np() pthread_attr_getname_np() pthread_attr_setname_np()
pthread_win32_getabstime_np()
Среды компилятора GNU (MinGW32 и MinGW64) теперь имеют возможность использовать autoconf для автоматической настройки сборки.
Сборки: добавлены новые цели make-файла, а существующие цели изменены или удалены. Например, целью является сборка и тестирование всех возможных конфигураций как dll, так и статических библиотек.
Сборки компилятора GNU теперь явно используют совместимость со стандартами ISO C и C++ 2011. Если ваш компилятор GNU не поддерживает это, рассмотрите возможность обновления. Автоматическая настройка теперь возможна с помощью сценария настройки. Скрипт должен быть сгенерирован с помощью autoconf — см. файл README. Спасибо Киту Маршаллу из проекта MinGW.
Статическое связывание. Автоматическая функциональность была перенесена в dll.c и расширена таким образом, что сборки с использованием MSVC8 и более поздних версий больше не требуют, чтобы приложения вызывали pthread_win32_thread_detach_np(). То есть все функции DllMain теперь автоматически выполняются для статического связывания этих сборок.
Некоторые цели статического связывания nmake отключены: из-за проблемы с поведением TLS цели V*-small-static* nmake в Makefile отключены. Проблема обнаруживается в файлеtests/semaphore3.c, где вызов pthread_self() внутри потока не возвращает правильный дескриптор потока POSIX, а вместо этого возвращает новый «неявный» дескриптор потока POSIX. Неявные дескрипторы pthread имеют статус отключенного потока, что приводит к тому, что вызов pthread_detach() внутри потока возвращает EINVAL. Цели V*-static*, похоже, не затронуты. Основное отличие состоит в том, что последние генерируются из одной единицы компиляции.
Статическое связывание небольших объектных файлов теперь работает (MinGW). Требуется автостатический код, но ничто явно не ссылается на этот код, поэтому он был оптимизирован.
sem_getvalue() может возвращать значение errno вместо установки errno и возврата -1.
Значения Errno терялись, если библиотека статически связана с библиотекой времени выполнения, что также означает, что приложение использовало отдельный экземпляр времени выполнения. Это по-прежнему так, за исключением того, что был добавлен переключатель сборки, который позволяет включать более надежный статус ошибки, т.е. позволяет получать код возврата через GetLastError().
Идентифицирована причина серьезных сбоев при отмене и pthread_exit() для конфигурации сборки GCE (GNU C++), исходящая из Mingw32. Не уверен, является ли это общим или просто при создании 32-битных библиотек и приложений, работающих в 64-битных системах. Эти сбои не возникают в 32-битных сборках Mingw64 (GCC, построенных с включенной поддержкой multilib), работающих в 64-битных системах.
Ошибка pthread_key_delete(), появившаяся в версии 2.9.x, привела к сбою этой процедуры, который не был обнаружен набором тестов. Был добавлен новый тест для подтверждения правильности работы этой процедуры, особенно когда ключи с деструкторами удаляются перед завершением потоков.
pthread_win32_process_attach_np() исправляет потенциальный сбой/безопасность при поиске и загрузке QUSEREX.DLL.
_POSIX_THREAD_ATTR_STACKADDR теперь установлен равным -1 в pthread.h. Как следствие, pthread_attr_setstackaddr() теперь возвращает ENOSYS. Раньше значение сохранялось и могло быть получено, но в противном случае оно не использовалось. pthread_attr_getstackaddr() возвращает ENOSYS соответственно.
Исправлена потенциальная утечка памяти в pthread_mutex_init(). Утечка произойдет только в том случае, если инициализация мьютекса не удалась (крайне редко, если вообще когда-либо).
Исправлены тайм-ауты менее миллисекунды, из-за которых библиотека была занята ожиданием.
Исправьте состояние гонки и сбой в блокировках MCS. Код управления очередью ожидающих в ptw32_mcs_lock_acquire состязался с кодом управления очередью в ptw32_mcs_lock_release и вызывал ошибку сегментации.
(27 мая 2012 г.)
Новые исправления ошибок в этом выпуске, начиная с версии 2.8.0, НЕ были применены к серии 1.xx.
Этот выпуск заменяет чрезвычайно краткий выпуск 2.9.0 и добавляет в последнюю минуту некоторые изменения, не связанные с кодом, для внедрения более описательных свойств в библиотеки DLL для указания целевой архитектуры и сред сборки.
Некоторые изменения в CVS, внесенные 26 февраля 2011 г., могут быть несовместимы с системами до Windows 2000.
Использование других версий библиотеки, кроме «C», теперь не рекомендуется. То есть версия «С++» не проходит некоторые тесты и не предоставляет никакой дополнительной функциональности.
Эта версия была протестирована на архитектуре SMP (Intel x64 Hex Core) путем выполнения включенного набора тестов, стресс-тестов и стендовых тестов.
Свойства DLL теперь правильно включают целевую архитектуру, т. е. щелкните правой кнопкой мыши файл pthreadVC2.dll в проводнике и выберите вкладку «Сведения», в поле описания отобразятся компилятор и архитектура, например «MS C x64» или «MS C x86».
Зависимость от библиотеки winsock теперь определяется по усмотрению с помощью #define RETAIN_WSALASTERROR
в config.h. По умолчанию он не определен, если не определен WINCE (поскольку я (RJ) не уверен в зависимости там).
(Сборки MSC и GNU) Статически связанная библиотека теперь автоматически инициализируется и очищается при запуске/выходе программы, т.е. статически связанным приложениям не требуется явно вызывать подпрограммы pthread_win32_process_attach_np() и pthread_win32_process_detach_np(). Подпрограмма для каждого потока pthread_win32_thread_detach_np() также вызывается при выходе из программы для очистки ресурсов POSIX, полученных основным собственным потоком Windows, если я (RJ) правильно понимаю этот процесс. Другим собственным потокам Windows, которые вызывают процедуры API POSIX, возможно, потребуется вызвать процедуру отсоединения потока при выходе из потока, если приложение зависит от освобожденных ресурсов POSIX или запуска деструкторов POSIX TSD (TLS). См. README.NONPORTABLE для описания этих процедур.
Надежные мьютексы реализованы в области PROCESS_PRIVATE. ОБРАТИТЕ ВНИМАНИЕ, что функции pthread_mutex_* могут возвращать разные коды ошибок для надежных мьютексов, чем при обычном использовании, например, pthread_mutex_unlock требуется для проверки владения всеми типами мьютексов, когда мьютекс устойчив, тогда как этого не происходит для «обычных» не-мьютексов. надежный тип мьютекса.
pthread_getunique_np реализован для совместимости уровня исходного кода с некоторыми другими реализациями. Эта процедура возвращает 64-битный порядковый номер, который однозначно связан с потоком. Он может использоваться приложениями для упорядочивания или хеширования дескрипторов потоков POSIX.
Еще много изменений для 64-битных систем.
Различные модификации и исправления для сборки и тестирования WinCE.
Исправьте pthread_cond_destroy() — не должно быть точкой отмены. Исправлены другие мелкие проблемы сборки.
Удалите потенциальное состояние взаимоблокировки из pthread_cond_destroy().
Различные модификации для сборки и тестирования для Win64.
Различные исправления в DLL помощника асинхронной отмены QueueUserAPCEx (это отдельная загрузка) и очистки кода pthreads.
Удалена потенциальная ссылка на NULL-указатель.
Удалено требование, чтобы приложения ограничивали количество потоков, вызывающих pthread_barrier_wait, только количеством барьеров. Также уменьшено противоречие между барьером_ожидания и барьером_разрушения. Это изменение немного замедлит работу барьеров, но уменьшит вдвое количество семафоров, потребляемых на барьер, до одного.
Исправлена утечка дескрипторов в sched_[gs]etscheduler.
Удалены все макросы совместимости реентерабельных функций POSIX из pthread.h. Некоторые из них были просто семантически некорректны.
Потоки больше не пытаются передавать неперехваченные исключения за пределы области действия потока (только сборки C++ и SEH). Неперехваченные исключения теперь приводят к завершению потока с кодом возврата PTHREAD_CANCELED.
Множество исправлений приведения типов, особенно для x64, исправлений взаимоблокировок и переработок для x64.
Зависимость от библиотеки winsock теперь определяется по усмотрению с помощью #define RETAIN_WSALASTERROR
в config.h. По умолчанию он не определен, если не определен WINCE (поскольку RJ не уверен в зависимости там).
Несколько статических мьютексов POSIX, используемых для внутреннего управления, были заменены блокировками на основе очередей MCS, чтобы уменьшить потребление ресурсов, в частности использование объектов Win32.
В целях безопасности файл QuuserEx.dll, если он используется, теперь должен быть установлен в системную папку Windows.
Robust[1-5].c — надежные мьютексыsequence1.c — уникальные порядковые номера для каждого потока.
Все тесты mutex*.c, где это возможно, были изменены для проверки надежных мьютексов в тех же условиях. Добавлены надежные тесты мьютекса в Benchtest*.c, где это возможно.
(22 декабря 2006 г.)
Новые исправления ошибок в этом выпуске, начиная с версии 2.7.0, не были применены к серии версий 1.xx. Вероятно, пришло время отказаться от версии 1.
Этот выпуск еще не тестировался на архитектурах SMP. Все тесты проходят на однопроцессорной системе.
Sem_destroy может вернуть EBUSY, даже если ни один поток не ожидает семафора. Другие гонки, связанные с аннулированием структур семафоров (внутренне), также были удалены.
semaphore5.c — тестирует исправление ошибки, упомянутое выше.
(04.06.2005)
Все новые функции этого выпуска были перенесены в версию 1.11.0, включая включение блокировок MCS в pthread_once, однако версии 1 и 2 остаются несовместимыми, хотя теперь они идентичны по производительности и функциональности.
Этот выпуск был протестирован (прошел набор тестов) как на однопроцессорных, так и на многопроцессорных системах.
Pthread_once был повторно реализован для устранения повышения приоритета и других сложностей для повышения надежности. Гонки для дескрипторов Win32, которые не являются уникальными для повторного использования, были удалены. Общая форма pthread_once теперь такая же, как предложенная ранее Александром Тереховым, но вместо «именованного мьютекса» реализована блокировка на основе очереди, обладающая необходимыми свойствами динамической самоинициализации и уничтожения. Этот замок также эффективен. ABI не затрагивается, поскольку размер pthread_once_t не изменился и PTHREAD_ONCE_INIT не изменился, однако приложения, которые заглядывают внутрь pthread_once_t, который должен быть непрозрачным, выйдут из строя.
(19 мая 2005 г.)
Все исправления ошибок и новые функции в этом выпуске были перенесены в выпуск 1.10.0.
Этот выпуск был протестирован (прошел набор тестов) как на однопроцессорных, так и на многопроцессорных системах. Спасибо Тиму Тейзену из TomoTherapy за исчерпывающее проведение тестов MP и за предоставление важных наблюдений и данных при обнаружении неисправностей.
(09 мая 2005 г.)
Пакет теперь включает набор справочной документации, состоящий из страниц руководства в стиле Unix в формате HTML, которые были отредактированы для обеспечения совместимости с pthreads-win32. Этот набор также можно прочитать в Интернете по адресу: http://sources.redhat.com/pthreads-win32/manual/index.html.
Еще раз спасибо Тиму Тейзену за запуск предварительной версии набора тестов в системе MP.
Все исправления ошибок и новые функции в этом выпуске были перенесены в выпуск 1.9.0.
Исправленная реализация позволяет избежать необходимости использования проблемного HANDLE и освобождает память, как только ключ будет удален, ИЛИ поток завершится, в зависимости от того, что произойдет раньше.
Спасибо Ричарду Хьюзу из Aculab за обнаружение и локализацию утечки.
Деструкторы ключей TSD теперь обрабатываются не один раз, а до PTHREAD_DESTRUCTOR_ITERATIONS раз. PTHREAD_DESTRUCTOR_ITERATIONS уже некоторое время определен в pthread.h, но не используется.
Исправлена гонка учета семафоров между sem_post/sem_post_multiple и отменой sem_wait. Это та же проблема, что и с sem_timedwait, которая была исправлена в последней версии.
sem_init, sem_post и sem_post_multiple теперь проверяют, чтобы количество семафоров никогда не превышало _POSIX_SEM_VALUE_MAX.
Хотя sigwait() — это не что иное, как пустая операция, она должна, по крайней мере, быть точкой отмены, чтобы соответствовать стандарту.
стресс1.c — пытается выявить проблемы в переменной условия и логике ожидания семафора по времени. Этот тест был вдохновлен примером тестового кода Стефана Мюллера, который использовался для выявления ошибки sem_timedwait в последнем выпуске. Он не является частью обычного набора тестов, поскольку его запуск может занять некоторое время. Чтобы запустить его: nmake clean VC-stress
tsd2.c — проверяет, что деструкторы ключей запускаются повторно, если значение ключа tsd не равно NULL после запуска процедуры деструктора. Также проверяется возможность вызова pthread_setspecific() и pthread_getspecific() из деструкторов.
(26 апреля 2005 г.)
В настоящее время не планируется выпускать версию 3.0.0 для исправления проблем в pthread_once(). Другие возможные реализации pthread_once по-прежнему будут исследоваться на предмет возможного будущего выпуска в попытке уменьшить сложность текущей реализации.
Все исправления ошибок и новые функции в этом выпуске были перенесены в выпуск 1.8.0.
Исправлена гонка pthread_once (сбои в системе MP). Благодарим Тима Тейзена за проведение исчерпывающего предварительного тестирования его системы MP с использованием ряда компиляторов: VC++ 6 VC++ 7.1 Intel C++ версии 8.0. Все тесты пройдены. Также были сделаны некоторые незначительные улучшения скорости.
Исправлена ошибка переполнения целого числа в pthread_mutex_timedlock(), которая пропадала, когда sem_timedwait() была исправлена в версии 2.2.0. Эта процедура больше не возвращает ENOTSUP, если определен NEED_SEM — он поддерживается (NEED_SEM требуется только для версий WinCE до 3.0).
Исправлена ошибка тайм-аута в sem_timedwait().
Исправьте несколько проблем в условно включенном коде NEED_SEM. Включенный код NEED_SEM предоставляется для систем, которые не реализуют семафоры W32, таких как WinCE до версии 3.0. Альтернативная реализация семафоров POSIX создается с использованием событий W32 для этих систем, когда NEED_SEM определен. В этом выпуске этот код был полностью переписан для повторного использования большей части кода семафоров POSIX по умолчанию и, в частности, для реализации всех подпрограмм sem_*, поддерживаемых pthreads-win32. Тим Тайзен также запустил набор тестов для кода NEED_SEM в своей системе MP. Все тесты прошли.
Библиотека теперь без ошибок компилируется для компилятора Borland Builder 5.5.
pthread_once слишком сложен, но, насколько позволяет тестирование, он работает.
Версия dll Borland не проходит некоторые тесты из-за исключения чтения памяти. Причина пока неизвестна, но нельзя исключать ошибку компилятора.
(12 апреля 2005 г.)
Версия 1.7.0 представляет собой резервную копию функций и исправлений ошибок, новых в этой версии. См. предыдущие примечания в выпуске 2.0.0/General.
(04 апреля 2005 г.)
Добавлены цели makefile для создания версий библиотеки со статической ссылкой. И MinGW, и MSVC. Обратите внимание, что это не подразумевает каких-либо изменений в лицензировании LGPL, которое по-прежнему накладывает определенные условия на распространение программного обеспечения, статически связанного с этой библиотекой.
В pthread_once() имеется известная ошибка. Отмена процедуры init_routine приводит к потенциальной проблеме голодания (т. е. взаимоблокировки), если ожидающий поток имеет более высокий приоритет, чем инициирующий поток. Эта проблема будет исправлена в версии библиотеки 3.0.0.
Исправьте ошибку переполнения целого числа в sem_timedwait(). Кевин Люсье
Исправлены директивы препроцессора для статической компоновки. Димитар Панайотов
(16 марта 2005 г.)
(16 марта 2005 г.)
Этот выпуск представляет собой изменение ABI, а имя версии DLL увеличено с 1 до 2, например pthreadVC2.dll.
Версия 1.4.0 поддерживает новые функции, включенные в этот выпуск. Пожалуйста, распространяйте библиотеки DLL, созданные на основе этой версии, с обновлениями для приложений, созданных на основе pthreads-win32 версии 1.xx.
Название пакета изменилось: дата снимка заменена номером версии + описательной информацией. Например, это версия «pthreads-win32-2-0-0-release».
Версия 1.3.0
Версия 1.2.0
Версия 1.1.0
Версия 1.0.0
Этот снимок в первую очередь исправляет ошибку Condvar, представленную в Snapshot-2004-11-03. Версии DLL также было включено, чтобы приложения могли проверить информацию о совместимой с DLL Microsoft DLL, а также для расширения системы именования DLL для ABI и основных (не совместимых с Backward) API. Смотрите файл Readme для получения подробной информации.
Ресурс версии в стиле Microsoft был добавлен в DLL для приложений, которые хотят проверить совместимость с DLL во время выполнения.
Наименование DLL Pthreads-Win32 было расширено, чтобы позволить несовместимым версиям DLL сосуществовать в той же файловой системе. Подробнее см. Файл README, но кратко: хотя информация о версии внутри DLL изменится с каждым релизом с момента включения, имена версий DLL будут изменяться только в том случае, если новый DLL не совместим с более старыми приложениями.
Схема управления версиями была заимствована у GNU Libtool, а схема именования DLL от Cygwin. При условии, что правила нумерации в стиле Libtool являются чести, схема именования Cygwin DLL автоматически гарантирует, что изменения имени DLL минимальны и что приложения не будут загружать несовместимую DLL Pthreads-Win32.
Те, кто использует предварительно построенные DLL, обнаружат, что имена DLL/LIB имеют новый суффикс (1) в этом снимке. Например, pthreadvc1.dll и т. Д.
Некоторые макросы POSIX изменились.
Эти изменения предназначены для соответствия одной версии 3 Specization UNIX, которая указывает, что, если установить 0 (ноль) или не определенные, приложения могут использовать sysconf () для определения их значений во время выполнения. Pthreads-Win32 не реализует sysconf ().
Следующие макросы больше не являются неопределенными, но определены и устанавливаются на -1 (не реализованы):
_POSIX_THREAD_ATTR_STACKADDR
_POSIX_THREAD_PRIO_INHERIT
_POSIX_THREAD_PRIO_PROTECT
_POSIX_THREAD_PROCESS_SHARED
Следующие макросы определены и устанавливаются на 200112L (реализовано):
_POSIX_THREADS
_POSIX_THREAD_SAFE_FUNCTIONS
_POSIX_THREAD_ATTR_STACKSIZE
_POSIX_THREAD_PRIORITY_SCHEDULING
_POSIX_SEMAPHORES
_POSIX_READER_WRITER_LOCKS
_POSIX_SPIN_LOCKS
_POSIX_BARRIERS
Следующие макросы определены и устанавливаются на соответствующие значения:
_POSIX_THREAD_THREADS_MAX
_POSIX_SEM_VALUE_MAX
_POSIX_SEM_NSEMS_MAX
PTHREAD_DESTRUCTOR_ITERATIONS
PTHREAD_KEYS_MAX
PTHREAD_STACK_MIN
PTHREAD_THREADS_MAX
DLL, произведенные из этого снимка, не могут использоваться со старыми приложениями без перекомплектования приложения, из -за изменения на Pthread_t для обеспечения уникальных идентификаторов потока POSIX.
Хотя этот снимок проходит расширенный набор тестов, многие из изменений являются довольно важными, и некоторые приложения могут демонстрировать другое поведение, чем ранее, поэтому принять с осторожностью. Надеемся, что любое измененное поведение будет связано с тем, что библиотека будет лучше на работе, а не хуже.
pthread_create () больше не принимает null в качестве ссылки на потоку arg. Полученность Segfault (ошибка доступа к памяти), и ни один поток не будет создан.
pthread_barrier_wait () больше не действует как точка отмены.
Исправить потенциальное состояние гонки в pthread_once ()
Добавлено для совместимости: pthread_recurive_mutex_initializer, pthread_errorcheck_mutex_initialize
Первоначальная поддержка компилятора Digital Mars
Быстрее мутекс. Они были переписаны после модели, предоставленной Александром Тереховом, которая снижает проверки пространства ядра и устраняет некоторые дополнительные критические разделы, используемые для управления расой между истечением времени и разблокировки. Пожалуйста, имейте в виду, что новые мутекс не обеспечивают строгого абсолютного планирования Mutexes FIFO, однако любое приобретение блокировки вне порядка должно быть очень редким.
Быстрее семафоры. Следуя аналогичной модели с Mutexes выше, они были переписаны, чтобы использовать предварительные проверки пространства пользователей.
sem_getvalue () теперь возвращает количество официантов.
Идентификатор потока POSIX теперь имеет гораздо более сильные характеристики уникальности. Библиотека Гарранти, чтобы повторно использовать тот же идентификатор потока, по крайней мере, для 2^(словесных) циклов разрушения/создания потока.
SEMAPHORE4.C: Тестирование отмены нового SEM_WAIT ().
Semaphore4t.c: также для sem_timedwait ().
rwlock8.c: тесты и время медленных путей выполнения R/W, а также CV, мутекс и семафоры, на которых они построены.
Попытайтесь добавить Watcom в список компиляторов, которые могут построить библиотеку. Это не удалось в конце концов, из-за того, что он не читает Errno. Библиотека строит, но тестовый набор сбой. Смотрите readme.watcom для получения более подробной информации.
Примечание. Если вы не используете асинхронную отмену в своем приложении, или не нужно отменять потоки, которые заблокированы на системных ресурсах, таких как сетевой ввод-вывод, то непреодолимая отмена асинхронности по умолчанию является, вероятно, достаточно хороша. Тем не менее, Pthreads-WIN32 автоматически определяет доступность этих компонентов во время выполнения, поэтому вам не нужно перестроить библиотеку из источника, если вы передумаете позже.
Все советы, доступные в книгах и в других местах, не подходящими для использования асинхронной отмены в любом приложении, все еще стоит, но эта функция является долгожданным дополнением в отношении соответствия библиотеки стандарту POSIX.
Очистка управления приоритетом потока. В частности, настройка приоритета потока теперь пытается отобразить недопустимые значения WIN32 в диапазоне, возвращаемом ched_get_priority_min/max () для полезных значений. Смотрите readme.nononportable под «Приоритетом потока».
pthread_getschedparam () теперь возвращает приоритет, указанный в последнем вызове pthread_setschedparam () или установлен Pthread_create (), как того требует стандарт. Ранее pthread_getschedparam () неправильно возвращал приоритет работающего потока во время вызова, который мог быть скорректирован или временно повышен/понижен/понижен.
chard_get_priority_min () и chadi_get_priority_max () теперь верните -1 на ошибку и установите errno. Ранее они неправильно возвращали значение ошибки напрямую.
pthread_self () освободит вновь созданный контрольный ручка потока POSIX, если DuplicateHandle не удастся вместо переработки (очень маловероятно).
pthread_exit () не был не освобождал и не переработала структуру потока POSIX для неявных потоков POSIX.
После первоначальной реализации Джона Босса библиотека позволила не POSIX инициализированные потоки (потоки WIN32) вызовать подпрограммы Pthreads-WIN32 и, следовательно, взаимодействовать с потоками POSIX. Это делается путем создания идентификатора потока Posix на лете для потока Win32, который после создания позволяет полностью переоценивать взаимодействие. Это не распространялось на отмену потока (асинхронизированное или отложенное). Теперь это так.
Любой поток может быть отменен любым другим потоком (WIN32 или POSIX), если известно значение POSIX POSIX POSIX POSIX_T. Это TSD -деструкторы и обработчики очистки Posix будут запускаться до того, как поток выходит из кода выхода Pthread_cancelle (получено с помощью GetExitCodeThread ()).
Это позволяет потоке Win32, например, вызову POSIX CV -процедуры так же, как и поток POSIX, с PthRead_Cond_Wait () Отмена и обработчики очистки (pthread_cond_wait () является точкой отмены posix).
При добавлении отмены потоки Win32 теперь должны иметь возможность вызывать все подпрограммы потоков POSIX, которые имеют смысл, включая семафоры, мутекс, переменные условия, блокировки чтения/записи, барьеры, спинлоки, TSD, очистка/поп, отмена, pthread_exit, планирование, и т. Д. .
Обратите внимание, что эти «неявные» идентификаторы потока POSIX на лете инициализируются как отдельные (не связанные) с отложенным типом отмены. Идентификатор потока POSIX будет создан автоматически любыми подпрограммами POSIX, которые нуждаются в ручке POSIX (если только подпрограмма требуется pthread_t в качестве параметра, конечно). Поток Win32 может обнаружить свой собственный идентификатор потока POSIX, вызывая pthread_self (), который при необходимости создаст ручку и вернет значение pthread_t.
Проверьте вышеуказанную новую функцию.
Этот снимок исправляет некоторую случайную коррупцию в новых источниках тестовых приложений. В исходном коде библиотеки нет изменений.
Различные изменения для ужесточения проверки ARG и работы с более поздними версиями MingW32 и MSYSDTK.
pthread_getschedparam () и т. Д., Фиксированная проверка достоверности опасных потоков.
SEM_TIMEDWAIT () теперь использует более жесткие проверки для необоснованных значений воздержания - что приведет к неожиданным значениям тайм -аута.
ptw32_cond_wait_cleanup () больше не загадочно потребляет сигналы CV, но может создавать более ложные пробуждения. Считается, что вызов sem_timedwait () потребляет сигнал CV, который он не должен.
Исправлена утечка памяти в ptw32_threaddestroy () для неявных потоков.
Исправлен потенциал для тупика в pthread_cond_destroy (). Тупика может произойти для статически объявленных CVS (pthread_cond_initializer), когда один поток пытается уничтожить переменную условия, в то время как другой пытается динамически инициализировать ее.
Ранее, если не определено, стиль очистки определяли автоматически от компилятора/языка, и одно из следующих была определена соответственно:
PTW32_CLEANUP_SEH MSVC only
PTW32_CLEANUP_CXX C++, including MSVC++, GNU G++
PTW32_CLEANUP_C C, including GNU GCC, not MSVC
Они определяют, определяют стиль очистки (см. Pthread.h) и, что наиболее важно, выполняется способ отмены и выхода из потока (через pthread_exit) (см. Обычный PTW32_Throw () в private.c).
Короче говоря, исключения версии библиотеки бросают исключение, когда поток отменяется или выходит (через pthread_exit ()), который попадает в обработчик в подпрограмме запуска потока, так что разматывание правильного стека происходит независимо от того, где происходит, где происходит, независимо от того, где Поток - это когда он отменен или выходит через pthread_exit ().
В этом и будущем снимках, если только сборка явно не определяет (например, через опцию компилятора) ptw32_cleanup_seh, ptw32_cleanup_cxx, или ptw32_cleanup_c, тогда сборка теперь всегда разделяет по умолчанию для очистки стиля ptw32_cleanup_c. В этом стиле используется SetJmp/Longjmp в реализациях отмены и pthread_exit и, следовательно, не будет делать разматывание стека, даже если они связаны с приложениями, которые имеют его (например, приложения C ++). Это для согласованности с большинством текущих коммерческих реализаций потоков Unix POSIX. Tru64 Compaq может быть исключением (без каламбура) и возможной будущей тенденцией.
Хотя это не было четко задокументировано ранее, все еще необходимо создать ваше приложение, используя то же самое PTW32_Cleanup_* DEFINE, который использовался для версии библиотеки, с которой вы ссылаетесь, так что были включены правильные части pthread.h. То есть возможные определения требуют следующих библиотечных версий:
PTW32_CLEANUP_SEH pthreadVSE.dll
PTW32_CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll
PTW32_CLEANUP_C pthreadVC.dll or pthreadGC.dll
Например, независимо от того, является ли ваше приложение C или C ++, если вы ссылаетесь с Pthreadvc.lib или Libpthreadgc.a, то вы должны определить ptw32_cleanup_c.
Смысл всего этого: если вы не определяли ни одного из них явно, то использовались значения по умолчанию, как описано в верхней части этого раздела.
Это теперь меняется, как было объяснено выше, но чтобы попытаться сделать это более ясным, вот пример:
Если вы строили свое приложение с помощью MSVC ++ IE, используя исключения C ++ и не явно определяя одно из PTW32_Cleanup_*, то PTW32_Cleanup_C ++ был автоматически определен для вас в pthread.h. Вы должны были связываться с pthreadvce.dll, который разматывает стека.
Если вы теперь создаете свое приложение, как и раньше, pthread.h теперь автоматически установит ptw32_cleanup_c в качестве стиля по умолчанию, и вам нужно будет связаться с Pthreadvc.dll. Раскрытие стека теперь не произойдет при отмене потока, или поток вызывает pthread_exit ().
Ваше заявление, скорее всего, будет вести себя по-разному от предыдущих версий и неочевидными способами. Скорее всего, в местном порядке объекты не могут быть уничтожены или очищены после отмены потока.
Если вы хотите такого же поведения, что и раньше, то теперь вы должны определить PTW32_Cleanup_c ++ явно, используя опцию компилятора и свяжусь с pthreadvce.dll, как вы это делали раньше.
Почему мы делаем стиль по умолчанию менее удобным для исключений? Потому что никакая коммерческая реализация потоков Unix Posix не позволяет вам выбрать разматывание стека. Следовательно, предоставление его в Pthread-Win32 в качестве дефолта опасно. Мы по -прежнему предоставляем выбор, но если вы сознательно не решите сделать иначе, ваши приложения Pthreads теперь будут работать или сбой аналогичным образом независимо от платформы Threads, которую вы используете. Или, по крайней мере, это надежда.
Почему бы не удалить исключения версий библиотеки вообще? Есть несколько причин:
Чтобы позволить создавать меньшие размеры изображений для приложений, которые связывают статически с библиотекой, большинство подпрограмм были разделены на отдельные файлы исходного кода.
Это делается таким образом, чтобы быть обратно совместимым. Старые исходные файлы повторно используются для сбора отдельных рутинных файлов в более крупные переводчики (через кучу #includes), чтобы компилятор все еще мог оптимизировать, где это возможно, например, через инлин, что может быть сделано только в той же единице перевода.
Также возможно построить всю библиотеку, составив один файл с именем «pthread.c», который просто #включает все файлы источников вторичного собрания. Компилятор может использовать это, чтобы сделать больше внедрения рутины.
Хотя компилятор GNU может создавать библиотеки с необходимым разделением (переключатель -функции -функциональный переключатель), AFAIK, MSVC и другие компиляторы не имеют этой функции.
Наконец, поскольку я использую Makefiles и компиляцию командной строки, я не знаю, какое ущерб эта реорганизация может взять на себя среди пользователей файлов проектов IDE. Вы должны иметь возможность продолжать использовать свои существующие файлы проекта без модификации.
pthread_num_processors_np ():
Возвращает количество процессоров в системе, которые доступны для процесса, как определено из аффинной маски процессора.
pthread_timechange_handler_np ():
Чтобы улучшить толерантность против оператора или службы времени, инициированных системными изменениями системных часов.
Эта подпрограмма может быть вызвана приложением, когда он получает сообщение WM_TIMECHANGE от системы. В настоящее время он транслирует все переменные условия, чтобы потоки ожидания могли проснуться и переоценить их условия и перезагрузить их временные ожидания, если это необходимо.
Поскольку Win95 не предоставляет его, библиотека теперь содержит свою собственную процедуру InterlockedCompareExchange (), которая используется всякий раз, когда Windows не предоставляет его. InterlockedCompareExchange () используется для реализации спинлоков и барьеров, а также в мутекс. Эта процедура опирается на инструкцию машины CMPXCHG, которая недоступна на процессорах I386. Таким образом, эта библиотека (от Snapshot 20010712) больше не поддерживается на платформах процессоров I386.
Только для переносимости исходного кода - Rwlocks еще не может быть обработанным общим.
pthread_rwlockattr_init()
pthread_rwlockattr_destroy()
pthread_rwlockattr_setpshared()
pthread_rwlockattr_getpshared()
Как определено в новом стандарте POSIX, и в одном Unix Spec версии 3:
sem_timedwait()
pthread_mutex_timedlock() - Alexander Terekhov and Thomas Pfaff
pthread_rwlock_timedrdlock() - adapted from pthread_rwlock_rdlock()
pthread_rwlock_timedwrlock() - adapted from pthread_rwlock_wrlock()
[Еще не для G ++]
Это было сделано для предотвращения конфликтов.
Руководство, DWORD и NULL временно определены в Pthread.H, если они еще не так.
Не только чтобы избежать необходимости в файле pthread.def, но и для повышения производительности. По -видимому, объявление функций с помощью dllimport генерирует прямой вызов функции и избегает накладных расходов вызова функции заглушки.
Это может быть сделано прозрачным для приложений путем замены макросов, которые определяют текущие версии C ++ и SEH Pthread_Cleanup_push/POP с версией C, но обработки очистки AFAIK не будут выполнять в правильной последовательности с деструкторами и обработчиками исключений, когда возникают исключения. .
Отмена когда -то началось в потоке теперь не может быть случайно отменена. То есть, как только поток начинает свою отмену, отмену отмены, а последующий запрос отмены вернет ошибку (ESRCH).
ERRNO: Неверная директива компилятора вызвала использование локальной версии Errno вместо Win32 Errno. Оба экземпляра безопасны для потока, но приложения, проверяющие Errno после того, как вызов Pthreads-Win32 будет неправильным. Исправление это также исправлено плохую опцию компилятора в TestSuite ( /MT должен был быть /MD), которая необходима для связи с правильной библиотекой MSVCRT.LIB.
Будет добавлено
Будет добавлено
Новый:
Renamed DLL and LIB files:
pthreadVSE.dll (MS VC++/Structured EH)
pthreadVSE.lib
pthreadVCE.dll (MS VC++/C++ EH)
pthreadVCE.lib
pthreadGCE.dll (GNU G++/C++ EH)
libpthreadw32.a
Both your application and the pthread dll should use the
same exception handling scheme.
Ошибки исправлены:
MSVC++ C++ exception handling.
Некоторые новые тесты были добавлены.
Новый:
asynchronous cancellation on X86 (Jason Nye)
Makefile compatible with MS nmake to replace
buildlib.bat
GNUmakefile for Mingw32
tests/Makefile for MS nmake replaces runall.bat
tests/GNUmakefile for Mingw32
Ошибки исправлены:
kernel32 load/free problem
attempt to hide internel exceptions from application
exception handlers (__try/__except and try/catch blocks)
Win32 thread handle leakage bug
(David Baggett/Paul Redondo/Eyal Lebedinsky)
Некоторые новые тесты были добавлены.
Ошибки исправлены:
ctime_r macro had an incorrect argument (Erik Hensema),
threads were not being created
PTHREAD_CANCEL_DEFERRED. This should have
had little effect as deferred is the only
supported type. (Ross Johnson).
Некоторые улучшения совместимости добавлены, например.
pthread_setcancelstate accepts NULL pointer
for the previous value argument. Ditto for
pthread_setcanceltype. This is compatible
with Solaris but should not affect
standard applications (Erik Hensema)
Некоторые новые тесты были добавлены.
Исправление ошибки - Отмена потоков, ожидающих переменных состояния, теперь работает должным образом (Лорин Хохштейн и Питер Слацик)
Исправленная очистка стека исключений при вызове pthread_exit ()
Исправлены ошибки в переменных условия - (Питер Слацик): - Дополнительные проверки конфликта - должным образом отрегулируйте количество резьбов ожидания после временного тайм -аута Condvar.
Некоторые незначительные ошибки были исправлены. Смотрите файл ChangeLog для получения подробной информации.
Еще некоторые функции Posix 1B теперь включены, но Ony возвращает ошибку (enosys), если вы вызываете. Они есть:
sem_open
sem_close
sem_unlink
sem_getvalue
Некоторые функции POSIX 1B, которые были внутренне поддерживаемыми, теперь доступны в качестве экспортируемых функций:
sem_init
sem_destroy
sem_wait
sem_trywait
sem_post
sched_yield
sched_get_priority_min
sched_get_priority_max
Некоторые незначительные ошибки были исправлены. Смотрите файл ChangeLog для получения подробной информации.
Первоначальный выпуск.