RedFox20 + Oktonion + WinBuild 的组合pthread-win32
分支
PThread https://github.com/WinBuilds/pthread-win32 更改:
这是 pthreads-win32 软件包 2.10.0.0 版本的一个分支。该前叉的 ABI 与原来的不同。
所做的更改:
ptw32_handle_t
中的重用计数器类型已从int
更改为size_t
,以便于长时间运行的服务器。
从pthread_once_t
中删除了未使用的元素
该库经常与我们的其他 Visual Studio 2022 项目一起测试。
一般来说,我在工作中使用(并且已经使用过)MSVC20xx 项目文件。 Makefiles 使用的频率要低得多,并且可能已经过时。
请注意提交消息 d4b0ef6b:虽然 MSVC2022/2019 项目已配置为适合我的内部设置,但它可能不适合您的。
当然,您始终可以手动编辑设置,但是当您需要对许多vcxproj
项目文件执行此操作时,编写任务脚本可能是最佳选择。请参阅update-vcxproj.js
和patch-vcxproj.js
以获取执行此类操作的示例脚本。我使用这些来确保我的所有 C/C++ 项目都具有完全相同的构建设置,这样我就不会遇到任何令人讨厌的运行时意外,因为某些项目决定使用稍有不同的调试/发布静态/DLL 运行时库进行构建,等等:你可以获得无数种方法?通过 Windows 环境中的构建系统。乐趣! ?
(2021-12-17)
这是一个微版本,主要包含管理修复。
mkdir b && cd b && cmake -G "Visual Studio 16 2019" ..
进行独立测试:好的。这意味着几个潜伏的错误已被修复,并且当 C 源代码有条件编译为 C++ 时,我们已经包含了 CMake 废话的解决方法(我仍然不喜欢该工具)(另请参阅 pthread-EH.cpp和 pthread-JMP.c:两个新的包装器源文件)。 这是一个微版本,主要包含管理修复。
通过完成随附的测试套件以及压力和基准测试,MSVC 和 MinGW64 版本已在 SMP 架构(Intel x64 Hex Core)上进行了测试。
请务必针对测试套件运行您的构建。如果您发现失败,请考虑您的工具链可能如何导致失败。有关我们用来成功通过测试的工具链和测试系统的更多详细说明,请参阅自述文件。
对于 64 位和 32 位 GNU CC 构建,我们建议使用 MinGW64 而不是 MinGW,只是因为 C++ 构建的 MinGW DWARF2 异常处理会导致线程取消的一些问题。
MinGW64 还包含其自己的本机 pthreads 实现,您可能更喜欢使用它。如果您希望构建我们的库,您需要在安装时选择 Win32 本机线程选项。我们还建议为 MinGW64-w32 构建选择 SJLJ 异常处理方法。对于 MinGW64-w64 构建,SJLJ 或 SEH 异常处理方法应该有效。
(2018-08-08)
请注意,这是一个新的主要版本。主要版本增量引入了两个 ABI 更改以及其他命名更改,这些更改将需要重新编译链接应用程序,并且可能需要对配置和源文件中的编译时宏引用进行一些文本更改,例如 PTW32_* 更改为 PTW32_ 、 ptw32_ 更改为 ptw32_* 等。
经所有重要相关贡献者同意,pthreads-win32 / pthreads4w 版本 3(除四个文件外)将根据 Apache License v2.0 的条款发布。 APLv2 与 GPLv3 和 LGPLv3 许可证兼容,因此该代码可以继续合法地包含在 GPLv3 和 LGPLv3 项目中。
重要相关贡献者被定义为贡献了实现未来版本中存在的功能的原始代码的人。这不包括一些贡献者,他们贡献了已过时的代码,或者提供了修复错误、出于美观或实用目的重新组织代码或改进构建过程的补丁。这种区别是必要的,以便在可能无法联系到所有贡献者的情况下继续前进。所有贡献者都列在 CONTRIBUTORS 文件中。
将保留 LGPL 但更改为 v3 的四个文件是用于配置 GNU 环境构建的文件:
aclocal.m4
configure.ac
GNUmakefile.in
tests/GNUmakefile.in
请求此更改或在咨询后同意此更改的贡献者是:
pthreads-win32 / pthreads4w 版本 2 版本将保留 LGPL,但版本 2.11 及更高版本将在该许可证的 v3 下发布,因此反向移植到 v2 的 pthreads4w 版本 3 代码的任何添加都不会污染该代码。
2011 年 2 月 26 日之后的一些更改可能与 Windows 2000 之前的系统不兼容。
自 2.8.0 以来所有版本中的新错误修复尚未应用于 1.xx 系列。
通过完成随附的测试套件以及压力和基准测试,MSVC、MinGW 和 MinGW64 版本已在 SMP 架构(Intel x64 Hex Core)上进行了测试。
请务必针对测试套件运行您的构建。如果您发现失败,请考虑您的工具链可能如何导致失败。有关我们用来成功通过测试的工具链和测试系统的更多详细说明,请参阅自述文件。
对于 64 位和 32 位 GNU CC 构建,我们建议使用 MinGW64 而不是 MinGW,只是因为 C++ 构建的 MinGW DWARF2 异常处理会导致线程取消的一些问题。
MinGW64 还包含其自己的本机 pthreads 实现,您可能更喜欢使用它。如果您希望构建我们的库,您需要在安装时选择 Win32 本机线程选项。我们还建议为 MinGW64-w32 构建选择 SJLJ 异常处理方法。对于 MinGW64-w64 构建,SJLJ 或 SEH 异常处理方法应该有效。
除以下内容外,此版本的功能与 v2.11.0 等效。
此版本引入了对 pthread_t 和 pthread_once_t 的更改,这将影响与该库链接的应用程序。
pthread_t:仍然是一个结构体,但将重用计数器从 32 位扩展到 64 位。在 64 位机器上,对象的整体大小不会增加,我们只需充分利用 4 个字节的填充,即可降低计数器在长时间运行的应用程序中从小到实际上为零的风险。 64 位重用计数器将无风险运行时间从几个月(假设平均线程生命周期为 1 毫秒)延长到几个世纪(假设平均线程生命周期为 1 纳秒)。
pthread_once_t:删除两个长期废弃的元素并减小其大小。
(2018-08-08)
自 2.8.0 以来所有版本中的新错误修复尚未应用于 1.xx 系列。
2011 年 2 月 26 日之后的一些更改可能与 Windows 2000 之前的系统不兼容。
pthreads-win32 / pthreads4w 版本 2.11 和所有未来的 2.x 版本将根据 Lesser GNU 公共许可证版本 3 (LGPLv3) 发布。
该软件的下一个主要版本(版本 3)将根据 Apache 许可证版本 2.0 (ALv2) 发布。根据 LGPLv3 发布 2.11 将允许对该软件版本 3 的修改向后移植到版本 2。除此之外,当前使用此库的任何 GPL 项目将能够继续在其项目中使用此代码的版本 2 或 3。
欲了解更多信息,请参阅:https://www.apache.org/licenses/GPL-compatibility.html
为了与此更改保持一致,从此时起,仅根据 ALv2 条款针对此软件的版本 3 接受对此库的修改。然后,它们将在适当的情况下向后移植到版本 2。
我们希望在发布 2.11 版本的同时发布版本 3。
通过完成随附的测试套件以及压力和基准测试,该版本已在 SMP 架构(Intel x64 Hex Core)上进行了测试。
请务必针对测试套件运行您的构建。如果您发现失败,请考虑您的工具链可能如何导致失败。有关我们用来成功通过测试的工具链和测试系统的更多详细说明,请参阅自述文件。对于 64 位和 32 位 GNU CC 构建,我们建议使用 MinGW64 而不是 MinGW32。 MinGW64 还包含自己的独立 pthreads 实现,您可能更喜欢使用它。
对于 Microsoft 工具链构建: (1) 静态链接要求此库和任何链接库或应用程序都使用 /MT 进行一致编译。
(2) 静态库已重命名为 libpthreadV*.lib,以区别于 DLL 导入库 pthreadV*.lib。
(3) 如果您使用混合链接,例如将库的静态 /MT 版本链接到与 /MD 链接的应用程序,您可以使用 GetLastError() 来询问错误代码,因为库设置了两个 errno(通过 _set_errno ()) 和 SetLastError()。
删除在标头中设置 PTW32_USES_SEPARATE_CRT 的尝试,这可能会导致意外结果。在某些情况下,用户可能希望在构建库或应用程序或两者时在其环境中显式定义它以调用它的效果。请参阅自述文件。不可移植。 ——罗斯·约翰逊
该库在完全静态链接的场景下应该更加可靠。注意:我们已删除 PIMAGE_TLS_CALLBACK 代码并恢复为较早的方法,该方法在所有编译器版本中似乎都更可靠。
对 GNUmakefile 的各种更正。尽管此文件已被删除,但为了完整性,更改已记录为对存储库的提交。
MinGW64-w64 将 pid_t 定义为 __int64。 sched.h 现在反映了这一点。
一些测试已被修复,这些测试在负载下的机器上会失败。使用类似的原始机制来同步线程的其他测试(这些是单元测试)也应用了相同的改进:semaphore5.c 认识到 sem_destroy 可以合法地返回 EBUSY; mutex6*.c、mutex7*.c 和 mutex8*.c 都用轮询循环替换了单个 Sleep()。
(2016-09-18)
自 2.8.0 以来所有版本中的新错误修复尚未应用于 1.xx 系列。
2011 年 2 月 26 日之后的一些更改可能与 Windows 2000 之前的系统不兼容。
通过完成随附的测试套件以及压力和基准测试,该版本已在 SMP 架构(Intel x64 Hex Core)上进行了测试。
请务必针对测试套件运行您的构建。如果您发现失败,请考虑您的工具链可能如何导致失败。有关我们用来成功通过测试的工具链和测试系统的更多详细说明,请参阅自述文件。对于 64 位和 32 位 GNU CC 构建,我们建议使用 MinGW64 而不是 MinGW32。 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 自动配置构建。
构建:添加了新的 makefile 目标,并修改或删除了现有目标。例如,目标是构建和测试 dll 和静态库的所有可能配置。
GNU 编译器构建现在明确使用 ISO C 和 C++ 2011 标准兼容性。如果您的 GNU 编译器不支持此功能,请考虑更新。现在可以通过“配置”脚本进行自动配置。该脚本必须使用 autoconf 生成 - 请参阅 README 文件。感谢 MinGW 项目的 Keith Marshall。
静态链接:自动静态功能已移至 dll.c 并进行了扩展,以便使用 MSVC8 及更高版本进行构建时不再需要应用程序调用 pthread_win32_thread_detach_np()。也就是说,所有 DllMain 功能现在都自动用于这些构建的静态链接。
一些 nmake 静态链接目标已被禁用:由于 TLS 行为问题,Makefile 中的 V*-small-static* nmake 目标已被禁用。这个问题是由 test/semaphore3.c 暴露的,其中线程内的 pthread_self() 调用无法返回正确的 POSIX 线程句柄,而是返回一个新的“隐式”POSIX 线程句柄。隐式 pthread 句柄具有分离线程状态,这会导致线程内的 pthread_detach() 调用返回 EINVAL。 V*-static* 目标似乎不受影响。主要区别在于后者是从单个编译单元生成的。
小目标文件静态链接现在可以使用 (MinGW)。自动静态代码是必需的,但没有任何明确引用此代码,因此正在优化。
sem_getvalue() 可以返回 errno 值,而不是设置 errno 并返回 -1。
如果库与运行时库静态链接,则 Errno 值将会丢失,这也意味着应用程序使用单独的运行时实例。情况仍然如此,只是添加了一个构建开关,允许合并更强大的错误状态,即允许通过 GetLastError() 检索返回代码。
确定了来自 Mingw32 的 GCE (GNU C++) 构建配置的取消和 pthread_exit() 重大失败的原因。不确定这是否是普遍现象,还是仅在构建在 64 位系统上运行的 32 位库和应用程序时出现。在 64 位系统上运行的 Mingw64 32 位构建(启用 multilib 构建的 GCC)不会出现这些故障。
版本 2.9.x 中引入的 pthread_key_delete() 错误导致此例程以测试套件未检测到的方式失败。添加了一个新测试来确认此例程行为正确,特别是在线程退出之前删除带有析构函数的键时。
pthread_win32_process_attach_np() 修复了查找和加载 QUSEREX.DLL 时潜在的故障/安全问题。
_POSIX_THREAD_ATTR_STACKADDR 现在在 pthread.h 中设置为等于 -1。因此,pthread_attr_setstackaddr() 现在返回 ENOSYS。以前该值已存储并且可以检索,但在其他情况下未使用。 pthread_attr_getstackaddr() 相应地返回 ENOSYS。
修复了 pthread_mutex_init() 中潜在的内存泄漏。仅当互斥体初始化失败时才会发生泄漏(如果有的话,则极其罕见)。
修复了导致库忙等待的亚毫秒超时。
修复 MCS 锁中的竞争条件和崩溃。 ptw32_mcs_lock_acquire 中的等待队列管理代码与 ptw32_mcs_lock_release 中的队列管理代码竞争并导致分段错误。
(2012-05-27)
自 2.8.0 以来此版本中的新错误修复尚未应用于 1.xx 系列。
此版本取代了极其简短的 2.9.0 版本,并添加了一些最后一刻的非代码更改,以便在 dll 中嵌入更好的描述性属性,以指示目标体系结构和构建环境。
2011 年 2 月 26 日之后 CVS 中的某些更改可能与 Windows 2000 之前的系统不兼容。
现在不鼓励使用“C”版本以外的库。也就是说,“C++”版本未通过某些测试并且不提供任何附加功能。
该版本已通过完成随附的测试套件、压力和基准测试,在 SMP 架构(Intel x64 Hex Core)上进行了测试。
DLL 属性现在正确包含目标体系结构,即在资源管理器中右键单击文件 pthreadVC2.dll 并选择“详细信息”选项卡将在描述字段中显示编译器和体系结构,例如“MS C x64”或“MS C x86”。
现在可以通过 config.h 中的#define RETAIN_WSALASTERROR
来决定对winsock 库的依赖。默认情况下它是未定义的,除非定义了 WINCE(因为我(RJ)不确定那里的依赖关系)。
(MSC 和 GNU 版本)静态链接库现在会在程序启动/退出时自动初始化和清理,即静态链接应用程序无需显式调用例程 pthread_win32_process_attach_np() 和 pthread_win32_process_detach_np()。如果我(RJ)正确理解了该进程,则在程序退出时还会调用每线程例程 pthread_win32_thread_detach_np() 来清理主 Windows 本机线程获取的 POSIX 资源。如果应用程序依赖于回收的 POSIX 资源或运行 POSIX TSD (TLS) 析构函数,则调用 POSIX API 例程的其他 Windows 本机线程可能需要在线程退出时调用线程分离例程。有关这些例程的说明,请参阅 README.NONPORTABLE。
健壮的互斥锁是在 PROCESS_PRIVATE 范围内实现的。请注意,pthread_mutex_* 函数可能会为稳健互斥体返回与正常使用时不同的错误代码,例如,当互斥体稳健时,需要 pthread_mutex_unlock 来检查所有互斥体类型的所有权,而对于“正常”非互斥体则不会发生这种情况。健壮的互斥类型。
pthread_getunique_np 的实现是为了与其他一些实现实现源级兼容性。此例程返回与线程唯一关联的 64 位序列号。应用程序可以使用它来排序或散列 POSIX 线程句柄。
64 位系统还有更多变化。
用于构建和测试 WinCE 的各种修改和修复。
修复 pthread_cond_destroy() - 不应该是取消点。修复了其他小构建问题。
从 pthread_cond_destroy() 中消除潜在的死锁条件。
针对 Win64 构建和测试的各种修改。
对 QueueUserAPCEx 异步取消帮助程序 DLL(这是单独下载)和 pthreads 代码清理的各种修复。
删除了潜在的 NULL 指针引用。
删除了应用程序将调用 pthread_barrier_wait 的线程数限制为屏障计数的要求。也减少了barrier_wait和barrier_destroy之间的争用。这一变化将稍微减缓屏障的速度,但将每个屏障消耗的信号量数量减半至一个。
修复了 sched_[gs]etscheduler 中的句柄泄漏。
从 pthread.h 中删除了所有 POSIX 可重入函数兼容性宏。有些在语义上根本不正确。
线程不再尝试将未捕获的异常传递到线程范围之外(仅限 C++ 和 SEH 构建)。未捕获的异常现在会导致线程退出并返回代码 PTHREAD_CANCELED。
许多特别针对 x64 的转换修复、针对 x64 的互锁修复和返工。
现在可以通过 config.h 中的#define RETAIN_WSALASTERROR
来决定对winsock 库的依赖。默认情况下它是未定义的,除非定义了 WINCE(因为 RJ 不确定那里的依赖关系)。
用于内部管理的几个静态 POSIX 互斥体被基于 MCS 队列的锁取代,以减少资源消耗,特别是 Win32 对象的使用。
为了安全起见,QuserEx.dll(如果使用)现在必须安装在 Windows 系统文件夹中。
Robust[1-5].c - 稳健的互斥体sequence1.c - 每个线程唯一的序列号
所有 mutex*.c 测试在适当的情况下都已进行修改,以便在相同条件下测试稳健的互斥体。在适当的地方向 benchtest*.c 添加了强大的互斥基准测试。
(2006-12-22)
自 2.7.0 以来此版本中的新错误修复尚未应用于版本 1.xx 系列。可能是时候放弃版本 1 了。
此版本尚未在 SMP 架构上进行测试。所有测试均在单处理器系统上通过。
即使没有线程在等待信号量,Sem_destroy 也可能返回 EBUSY。其他围绕无效信号量结构(内部)的竞争也已被删除。
semaphore5.c - 测试上述错误修复。
(2005-06-04)
此版本中的所有新功能均已向后移植到版本 1.11.0 中,包括在 pthread_once 中合并 MCS 锁,但是版本 1 和 2 仍然不兼容,尽管它们现在在性能和功能上相同。
此版本已在单处理器和多处理器系统上进行了测试(通过了测试套件)。
Pthread_once 已被重新实现,以消除优先级提升和其他复杂性,从而提高鲁棒性。非回收唯一的 Win32 句柄的竞争已被删除。 pthread_once 的一般形式现在与 Alexander Terekhov 之前建议的相同,但不是“命名互斥体”,而是实现了基于队列的锁,它具有动态自初始化和销毁所需的属性。这个锁也很高效。 ABI 不受影响,因为 pthread_once_t 的大小没有改变并且 PTHREAD_ONCE_INIT 没有改变,但是,窥视 pthread_once_t(应该是不透明的)内部的应用程序将会崩溃。
(2005-05-19)
此版本中的所有错误修复和新功能均已向后移植到版本 1.10.0 中。
此版本已在单处理器和多处理器系统上进行了测试(通过了测试套件)。感谢 TomoTherapy 的 Tim Theisen 详尽地运行了 MP 测试,并在检测到故障时提供了重要的观察结果和数据。
(2005-05-09)
该软件包现在包含一个参考文档集,其中包含 HTML 格式的 Unix 风格手册页,这些手册页经过编辑以与 pthreads-win32 保持一致。该集也可以在线阅读:http://sources.redhat.com/pthreads-win32/manual/index.html
再次感谢 Tim Theisen 在 MP 系统上运行预发布的测试套件。
此版本中的所有错误修复和新功能均已向后移植到版本 1.9.0 中。
修改后的实现避免了对有问题的 HANDLE 的需要,并在键被删除或线程退出(以先到者为准)后立即回收内存。
感谢 Aculab 的 Richard Hughes 识别并定位了泄漏点。
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()只不过是一个空操作,但它至少应该是一个取消点,以符合标准。
stress1.c - 尝试暴露条件变量和信号量定时等待逻辑中的问题。此测试的灵感来自 Stephan Mueller 的示例测试代码,该代码用于识别上一个版本中的 sem_timedwait 错误。它不是常规测试套件的一部分,因为它可能需要一段时间才能运行。运行它:nmake clean VC-stress
tsd2.c - 如果在析构函数例程运行后 tsd 键值不为 NULL,则测试键析构函数是否重新运行。还测试 pthread_setspecic() 和 pthread_getspecic() 是否可以从析构函数调用。
(2005-04-26)
现在没有计划发布 3.0.0 版本来修复 pthread_once() 中的问题。 pthread_once 的其他可能实现仍将在未来可能的版本中进行研究,以尝试降低当前实现的复杂性。
此版本中的所有错误修复和新功能均已向后移植到版本 1.8.0。
修复了 pthread_once 竞争(MP 系统上的失败)。感谢 Tim Theisen 使用一系列编译器在他的 MP 系统上运行详尽的预发布测试: VC++ 6 VC++ 7.1 Intel C++ 版本 8.0 所有测试均通过。还进行了一些小的速度改进。
修复 pthread_mutex_timedlock() 中的整数溢出错误 - 在版本 2.2.0 中修复 sem_timedwait() 时丢失。当定义 NEED_SEM 时,此例程不再返回 ENOTSUP - 它受支持(仅 3.0 之前的 WinCE 版本需要 NEED_SEM)。
修复 sem_timedwait() 中的超时错误。
修复了 NEED_SEM 有条件包含的代码中的几个问题。 NEED_SEM 包含的代码是为不实现 W32 信号量的系统提供的,例如 3.0 版本之前的 WinCE。当定义 NEED_SEM 时,使用这些系统的 W32 事件构建 POSIX 信号量的替代实现。该代码在此版本中已完全重写,以重用大多数默认 POSIX 信号量代码,特别是实现 pthreads-win32 支持的所有 sem_* 例程。 Tim Theisen 还在他的 MP 系统上通过 NEED_SEM 代码运行测试套件。所有测试都通过了。
现在,对于 Borland Builder 5.5 编译器来说,该库的构建不会出现错误。
pthread_once 太复杂了 - 但据测试可以确定它可以工作。
Borland 版本的 dll 由于内存读取异常而未能通过某些测试。原因尚不清楚,但不排除编译器错误。
(2005-04-12)
版本 1.7.0 是此版本中新功能和错误修复的向后移植。请参阅版本 2.0.0/General 下的早期注释。
(2005-04-04)
添加了 makefile 目标来构建库的静态链接版本。 MinGW 和 MSVC 都有。请注意,这并不意味着 LGPL 许可发生任何变化,LGPL 许可仍然对分发与该库静态链接的软件施加特定条件。
pthread_once() 中有一个已知错误。如果等待线程的优先级高于初始化线程,则取消 init_routine 会导致潜在的饥饿(即死锁)问题。该问题将在该库的 3.0.0 版本中得到修复。
修复 sem_timedwait() 中的整数溢出错误。凯文·卢西尔
修复静态链接的预处理器指令。迪米塔·帕纳约托夫
(2005-03-16)
(2005-03-16)
此版本代表 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
该快照主要修复了Snapshot-2004-11-03中引入的CONDVAR错误。还包括DLL版本控制,以允许应用程序运行时检查Microsoft兼容的DLL版本信息,并扩展了ABI和主要(非兼容)API更改的DLL命名系统。有关详细信息,请参见readme文件。
Microsoft-Style版本资源已添加到DLL中,以用于希望在运行时检查DLL兼容性的应用程序。
PTHREADS-WIN32 DLL命名已扩展,以允许不兼容的DLL版本在同一文件系统中共存。有关详细信息,请参见readme文件,但要简要介绍:虽然DLL中的版本信息从现在开始随着每个版本而更改,但DLL版本名称仅在新DLL与较旧应用程序兼容时才会更改。
版本传导方案是从GNU Libtool借来的,DLL命名方案来自Cygwin。只要对Libtool风格的编号规则进行尊重,Cygwin DLL命名方案自动确保DLL名称更改是最小的,并且应用程序不会加载不兼容的Pthreads-win32 DLL。
那些使用预先构建的DLL的人会发现DLL/LIB名称在此快照中具有新的后缀(1)。例如pthreadvc1.dll等
某些POSIX宏已更改。
这些更改旨在符合单个UNIX规范版本3,该版本3指出,如果设置为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线程ID。
尽管此快照通过扩展测试套件,但许多更改都是相当重大的,并且某些应用可能显示出与以前不同的行为,因此请谨慎采用。希望任何改变的行为都将是由于图书馆在工作方面的表现更好,而不是更糟。
pthread_create()不再接受null作为线程参考arg。将会导致segfault(内存访问故障),并且不会创建线程。
pthread_barrier_wait()不再充当取消点。
修复PTHREAD_ONCE()中的潜在种族条件
添加兼容性:pthread_recursive_mutex_initializer,pthread_errorcheck_mutex_initializer,pthread_recursive_mutex_initializer_np,pthread_errorrorcheck_mutex_initialialialiser_np
对数字火星编译器的初步支持
更快的静音。根据亚历山大·泰雷科夫(Alexander Terekhov)提供的模型,这些模型已被重写,该模型减少了内核空间检查,并消除了一些其他关键部分,用于管理TimeDlock到期和解锁之间的竞赛。请注意,新的静音不会强制执行静音的绝对fifo调度,但是任何排序锁定的收购都应该非常罕见。
更快的信号量。遵循与上面的静音模型相似的模型,这些模型已被重写以使用初步用户空间检查。
Sem_getValue()现在返回服务员的数量。
POSIX线程ID现在具有更强的独特特性。图书馆garrantees不要将相同的线程ID重复使用至少2^(单词大小)线程破坏/创建周期。
Semaphore4.c:测试取消新的SEM_WAIT()。
Semaphore4t.c:同样适用于SEM_TIMEDWAIT()。
rwlock8.c:测试和时间r/w锁的缓慢执行路径,以及它们构建的CVS,静音和信号量。
尝试将WATCOM添加到可以构建库的编译器列表中。由于其不感知Errno,但最终失败了。图书馆构建,但测试套件失败。有关更多详细信息,请参见readme.watcom。
注意:如果您在应用程序中不使用异步取消,或者不需要取消在网络I/O等系统资源上阻止的线程,则默认的非抢先式异步取消可能足够好。但是,Pthreads-win32自动检测这些组件在运行时的可用性,因此,如果您以后更改主意,则无需从源重建库。
书籍和其他地方可用的所有建议在任何应用程序中使用异步取消的不良性仍然存在,但此功能是对图书馆对POSIX标准的一致性的欢迎。
清理线程优先管理。特别是,现在的线程优先级的设置试图在sched_get_get_priority_min/max()返回的范围内映射无效的win32值。请参阅“线程优先级”下的readme.nonport。
PTHREAD_GETSCHEDPARAM()现在返回由标准所要求的最新调用pthread_setschedparam()或由pthread_create()建立的优先级。以前,PTHREAD_GETSCHEDPARAM()在呼叫时错误地返回了运行线程优先级,该线程可能已调整或临时促进/降级。
sched_get_priority_min()和sched_get_priority_max()现在返回错误并设置errno。以前,他们直接返回错误值。
如果重复失败而不是回收(非常不可能),则pthread_self()将释放新创建的隐式POSIX线程句柄。
PTHREAD_EXIT()既没有释放也不会回收posix螺纹结构的隐式posix线程。
自从John Bossom的原始实现以来,该库允许非Posix初始化线程(Win32线程)调用Pthreads-Win32例程,因此与Posix线程进行了交互。这是通过为WIN32线程创建flly Posix线程ID来完成的,该线程一旦创建,就可以完全互动。这没有扩展到线程取消(异步或递延)。现在这样做了。
如果以前的线程的POSIX PTHREAD_T值已知,则任何其他线程都可以被任何其他线程(Win32或posix)取消。它的是TSD破坏者,POSIX清理处理程序将在线程退出使用PTHREAD_CANCELED的退出代码之前运行(使用GetExitCodeThread()检索)。
这允许Win32线程以与POSIX线程应/应该的方式来调用POSIX CV例程,使用PTHREAD_COND_WAIT()outcustability and Cleanup Handlers(PTHREAD_COND_WAIT()是POSIX取消点)。
通过添加取消,Win32线程现在应该能够调用所有有意义的POSIX线程例程,包括信号量,静音,条件变量,读/写锁,屏障,障碍物,TSD,TSD,清理/pop,pop,pop,natcellation,natcellation,pthread_exit,调度,调度,调度等,等等。
请注意,这些即时的“隐式” posix线程ID被初始化为具有延期取消类型的分离(非加入)。 POSIX线程ID将由需要POSIX句柄的任何POSIX例程自动创建(除非例程需要PTHREAD_T作为参数当然)。 Win32线程可以通过调用pthread_sers()来发现其自己的POSIX线程ID,该pthread_sers()将在必要时创建句柄并返回pthread_t value。
测试上述新功能。
此快照将一些意外腐败解决了新的测试案例源。库源代码没有更改。
各种更改以收紧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)的方式(请参阅private.c中的例程ptw32_throw()。
简而言之,库的例外版本在取消线程或退出线程时(通过PTHREAD_EXIT()),该线程在线程启动例程中被处理程序捕获,因此,正确的堆栈不在位置,无论如何在哪里发生线程是在取消或通过pthread_exit()退出时。
在此和将来的快照中,除非构建明确定义(例如通过编译器选项定义)ptw32_cleanup_seh,ptw32_cleanup_cxx或ptw32_cleanup_c,则现在始终将构建始终默认为PTW32_CLEANUP_CLEANUP_CC型清理。此样式在取消和PTHREAD_EXIT实现中使用setJMP/longJMP,因此即使链接到具有它的应用程序时也不会堆栈(例如C ++应用程序)。这是与大多数当前商业Unix Posix线程实现的一致性。 Compaq的TRU64可能是一个例外(无双关语)和可能的未来趋势。
尽管以前尚未清楚地记录下来,但仍然有必要使用相同的PTW32_CLEANUP_*定义与您链接的库版本使用相同的应用程序,以便包括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中自动定义了PTW32_CLEANUP_C ++。您应该一直与pthreadvce.dll链接,该dll确实堆叠了。
如果您现在像以前一样构建您的应用程序,则PTHREAD.H现在将自动将PTW32_CLEANUP_C设置为默认样式,并且您需要与PTHREADVC.DLL链接。当线程被取消或线程调用pthread_exit()时,现在不会发生堆栈放松。
现在,您的应用程序最有可能与以前的版本不同,并以非显而易见的方式行事。最有可能的是在取消线程后,本地实例化的对象可能不会被销毁或清理。
如果您想要与以前相同的行为,那么现在必须使用编译器选项明确定义PTW32_CLEANUP_C ++,并与以前一样与pthreadvce.dll链接。
为什么我们使默认样式降低了异常友好型?因为没有商业的Unix POSIX线程实现使您可以选择放松堆栈。因此,将其作为默认值在pthread-win32中提供危险。我们仍然提供选择,但是除非您有意识地选择其他选择,否则您的PTHreads应用程序现在将以类似的方式运行或崩溃,而与您使用的线程平台无关。或至少这是希望。
为什么不完全删除库的例外版本?有几个原因:
为了使较小的图像大小用于与库型固定链接的应用程序,大多数例程已分为单个源代码文件。
这是以向后兼容的方式完成的。将旧的源文件重新使用,以将单个例行文件聚集到较大的翻译单元中(通过一堆#includes),以便编译器仍然可以在可能的情况下进行优化,例如,通过内部内部,只能在同一翻译单元中进行。
也可以通过编译名为“ pthread.c”的单个文件来构建整个库,该文件只是#includ,其中包含所有二级会众源文件。编译器可能能够使用它来进行更多的例程。
尽管GNU编译器能够以必要的分离(-fruction -persegments Switch)生产库,但AFAIK,MSVC和其他编译器没有此功能。
最后,由于我使用makefiles和命令行汇编,因此我不知道这种重组可能在IDE项目文件用户中造成了什么破坏。您应该能够在没有修改的情况下继续使用现有的项目文件。
pthread_num_processors_np():
根据处理器亲和力掩模确定的系统中可用的系统中的处理器数量。
pthread_timechange_handler_np():
为了提高对操作员或时间服务启动的系统时钟变化的容忍度。
当应用程序从系统接收WM_TIMECHANGE消息时,可以通过应用程序调用此例程。目前,它广播了所有条件变量,以便等待线程可以醒来并重新评估其状况并在需要时重新启动其定时等待。
由于Win95不提供一个,因此该库现在包含其自己的InterlockedCompareeXchange()例程,该例程在Windows不提供时都会使用。 Interlockedcompareexchange()用于实现Spinlock和屏障,也用于静音。此例程依赖于i386 CPU上没有的CMPXCHG机器指令。因此,该库(从Snapshot 20010712开始)因此不再支持I386处理器平台。
仅对于源代码便携性 - rwlocks无法共享处理。
pthread_rwlockattr_init()
pthread_rwlockattr_destroy()
pthread_rwlockattr_setpshared()
pthread_rwlockattr_getpshared()
如新的POSIX标准和单个UNIX规格版本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 ++]
这样做是为了防止冲突。
handle,dword和null在pthread.h中暂时定义。
不仅是为了避免需要pthread.def文件,还要提高性能。显然,使用dllimport声明函数会直接调用该功能,并避免使用存根函数调用的开销。
可以通过更换定义当前C ++和SEH版本的pthread_cleanup_push/pop的宏来使其与应用程序透明,但使用C版本,但是Afaik Clearup Handlers不会随后使用DESTRUCTORS和异常清理操作机以正确的顺序运行。
一旦在线程中开始的取消现在就无法无意中双重取消。也就是说,一旦线程开始,它的取消运行,取消将被禁用,随后的取消请求将返回错误(ESRCH)。
ERRNO:不正确的编译器指令导致使用了本地版本的ERRNO,而不是Win32 Errno。这两个实例都是线程安全的,但是在pthreads-win32调用后检查errno的应用程序是错误的。修复此操作还修复了测试套件中的一个不良编译器选项( /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)
添加了一些新测试。
错误修复 - 在条件变量上等待的线程现在正常工作(Lorin Hochstein和Peter Slacik)
修复了异常堆栈清理如果调用pthread_exit()
修复了条件变量中的错误 - (Peter Slacik): - 额外的争论检查 - 定时condvar超时后,正确调整了等待线的数量。
一些小错误已得到修复。有关详细信息,请参见ChangElog文件。
现在包括一些更多的POSIX 1B功能,但如果调用了错误(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文件。
初次发布。