我只是将脚趾浸入POSIX池中,并首次尝试了POSIX线程。 到现在为止,我一直感觉到POSIX线程和Win32线程之间存在很大的体系结构差异,但是从我尝试的(虽然很小)来看,我并没有真正看到任何差异。
我仍然很好奇-POSIX线程和Win32线程之间有什么区别(如果有)? 它们从根本上是不同的,还是仅存在细微的差异?
相关讨论
在Windows NT家族内核和许多Unix内核中,如何"在幕后"管理和调度线程之间存在巨大差异,但这不是问题。
如果您只是在谈论接口(Win32线程和POSIX线程公开的服务),通过一些工作,您几乎可以将任何POSIX线程功能映射到Win32等效?1:1。 它已经完成了(请参阅pthreads-win32)。
我可能注意到的一个很大的不同是,在Win32下,您使用实际的系统调用来处理线程,而POSIX线程的调用是库(pthreads)的一部分,在许多Unix系统下,它调用Unix的一些非常低级的系统调用。 内核(在Linux下有clone())。
只是为了向您证明,除非深入研究,否则pthreads没什么特别的,您可以下载暴露了与pthreads完全相同的接口的pthreads-win32,并且任何函数都映射在Win32线程API上。 而且有效。
相关讨论
我正在安装 mingw-w64 on Windows,有两个选项: win32线程和posix线程。 我知道win32线程和pthreads之间的区别,但是我不明白这两个选项之间的区别。 我怀疑如果我选择了posix线程,它将阻止我调用像CreateThread这样的WinAPI函数。
似乎这个选项指定了哪个程序或者库将使用哪个线程 API,但通过什么? 由 GCC,libstdc++或者其他事物?
我发现:什么区别thread_posixs和 thread_win32 gcc Windows 港?
简而言之,对于这个版本的mingw,threads-posix发行版将使用 posix API并允许使用 std:: thread,threads-win32将使用 win32api,并禁用标准的std::thread 部分。
好的,如果我选择win32线程,那么 std::thread 将不可用,但是win32线程仍将被使用。 但是用什么?
gcc运行时( 特殊的异常处理)的部分依赖于正在使用的线程模型。 因此,如果你使用的是使用posix线程构建的运行时版本,但决定在你自己的代码中使用 win32 api创建线程,那么你可能会遇到一些问题。
即使你正在使用运行时的win32线程版本,你可能也不应该直接调用 win32 api 。 引用来自 MinGW常见问题解答:
由于MinGW使用了 Windows 附带的标准Microsoft运行时库,所以你应该小心并使用正确的函数来生成一个新的线程。
CreateThread
函数将不会正确地为运行时库设置堆栈。 你应该使用_beginthreadex
,它是( 几乎几乎) 完全兼容CreateThread
。
GCC附带了一个编译器运行时库( 宋体),它使用( 其中之一) 提供了一个用于在它的支持的语言中实现多线程相关功能的。 最相关的例子是 C++11 libstdc++
,
,
, gcc时没有一个完整的实现了其内部win32线程模型。 MinGW-w64提供了 winpthreads ( Win32多线程API之上的一个pthreads实现),GCC可以链接它来启用所有的奇妙特性。
我必须强调这里选项不允许你编写任何你想要的代码( 对于你可以在代码中调用的API,它有绝对的无影响) 。 它只反映了 (libgcc/libstdc++/...) 库的使用了哪些运行时。 由 @James 引用的警告与gcc线程模型的内部无关,而是与microsoft实现的CRT有关。
总结:
posix
: 启用 c++11/c11多线程功能。 使depend依赖于 libwinpthreads,这样即使你不直接调用 API,你将分发 winpthreads 。 使用应用程序分发一个DLL没有什么问题。win32
: 没有C++11多线程功能。对任何调用 Win32 api或者 pthreads api的用户代码都不影响。 你可以同时使用两个。
原作者:rubenvb
https://ask.helplib.com/windows/post_675746
--------------------------------------------------------------------------------------------------------------------------
我在Windows上安装mingw-w64,有两个选项:win32线程和posix线程。 我知道什么是win32线程和pthreads之间的区别,但我不明白这两个选项之间的区别是什么。 我怀疑,如果我会选择posix线程,它会阻止我调用像CreateThread WinAPI函数。
看来这个选项指定哪个线程API将被一些程序或库使用,但是通过什么? 通过海湾合作委员会,libstdc ++或其他?
我发现这个: 在windows的gcc端口thread_posixs和thread_win32之间有什么区别?
总之,对于这个版本的mingw,threads-posix版本将使用posix API并允许使用std :: thread,并且threads-win32将使用win32 API,并禁用std :: thread的部分标准。
好的,如果我将选择win32线程,那么std :: thread将不可用,但仍将使用win32线程。 但是用什么?
GCC带有一个编译器运行库(libgcc),它用于(除其他外)提供一个底层操作系统抽象,用于支持多语言相关功能。 最相关的例子是libstdc ++的C ++ 11
,
和
,当使用内部的Win32线程模型构建GCC时,没有完整的实现。 MinGW-w64提供了一个winpthreads(在Win32多线程API之上的一个pthreads实现),然后GCC可以链接到所有的奇特功能。
我必须强调这个选项并不禁止你编写任何你想要的代码(它对你可以在代码中调用的API 没有任何影响)。 它只反映了GCC运行时库(libgcc / libstdc ++ / ...)使用的功能。 @James引用的警告与GCC的内部线程模型无关,而与微软的CRT实现无关。
总结:
posix
:启用C ++ 11 / C11多线程功能。 使libgcc依赖于libwinpthreads,所以即使不直接调用pthreads API,也会分发winpthreads DLL。 分配一个更多的DLL与您的应用程序没有任何问题。win32
:没有C ++ 11多线程功能。对任何调用Win32 API或pthreads API的用户代码都没有影响。 你可以一直使用两者。
GCC运行时的一部分(尤其是异常处理)依赖于正在使用的线程模型。 因此,如果您使用的是使用POSIX线程构建的运行时版本,但是决定使用Win32 API在自己的代码中创建线程,则可能在某个时候出现问题。
即使使用运行时的Win32线程版本,也可能不应该直接调用Win32 API。 从MinGW常见问题引用:
由于MinGW使用Windows附带的标准Microsoft C运行时库,所以应该小心并使用正确的函数来生成新的线程。 特别是,
CreateThread
函数不会为C运行时库正确设置堆栈。 您应该使用_beginthreadex
,而(几乎)与CreateThread
完全兼容。
请注意,现在可以在win32线程模式下使用一些C ++ 11 std :: thread。 这些仅供头部使用的适配器为我开箱即用: https : //github.com/meganz/mingw-std-threads
从修订历史看来,最近有一些尝试将其作为mingw64运行时的一部分。
https://code.i-harness.com/zh-CN/q/1071994