mingw-w64线程模型:posix vs win32(posix允许使用c++11的std:: thread,但要带一个winpthreads,可能需要额外dll)

我正在安装 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++ <thread><mutex><future>, 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 <thread> , <mutex><future> ,当使用内部的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

原文地址:https://www.cnblogs.com/findumars/p/8290230.html

时间: 2024-08-02 20:58:25

mingw-w64线程模型:posix vs win32(posix允许使用c++11的std:: thread,但要带一个winpthreads,可能需要额外dll)的相关文章

posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用户空间的程序库来管理.OS内核完全不知道线程信息.这些线程称为用户空间线程.这些线程都工作在“进 程竞争范围”(process contention scope):各个线程在同一进程竞争“被调度的CPU时间”(但

Mina的线程模型

在Mina的NIO模式中有三种I/O工作线程(这三种线程模型只在NIOSocket中有效,在NIO数据包和虚拟管道中没有,也不需要配置): IoAcceptor/IoConnector线程 IoProcessor线程 IoHandler线程 一.Acceptor  thread 该线程的作用是接收客户端的连接,并将客户端的连接导入到I/O processor线程模型中.所谓的I/O processor线程模型就是Mina的I/O processor thread.Acceptor thread在

编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

建议87:区分WPF和WinForm的线程模型 WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button.TextBox等)必须由创建它的那个线程进行更新.WinForm在这方面的限制并不是很严格,所以像下面这样的代码,在WinForm中大部分情况下还能运行(本建议后面会详细解释为什么会出现这种现象): private void buttonStartAsync_Click(object sender, EventArgs e) { Task t = new Task(()

Kafka的三种客户端线程模型和一个小惊喜

Kafka 作为一个流式数据平台,对开发者提供了三种客户端:生产者 / 消费者.连接器.流处理.本文着重分析这三种客户端的线程模型.看到最后的通常都有惊喜.消费者的线程模型0.8 版本以前的消费者客户端会创建一个基于 ZK 的消费者连接器,一个消费者客户端是一个 Java 进程,消费者可以订阅多个主题,每个主题也可以多个线程.为了让消息在多个节点被分布式地消费,提高消息处理的吞吐量,Kafka 允许多个消费者订阅同一个主题,这些消费者需要满足"一个分区只能被一个消费者中的一个线程处理"

一个简单的线程锁------pthread和win32的临界区(Critical Section)

临界区: 临界区是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权.这是让若干代码能够"以原子操作方式"来使用资源的一种方法. 所谓原子(atomic)操作方式,是指这段代码知道没有别的线程要访问这个资源. 说明: 1.  MacOSX,Windows有自己的线程模型, pthread可以说是跨平台的线程编程模型解决方案,当然对pthread不熟悉的也可以使用本地线程模型, 其实pthread的win32版本也是基于本地线程模型的, pthread-win32的mutex

mingw w64的下载地址

mingw w64的下载地址,官网下载看得太晕.直接记下下载链接. https://sourceforge.net/projects/mingw-w64/ i686纯32位版供32位win系统使用.x86_64是64位系统用的版本,现在我们一般用的是64位系统,所以我们可以在四个x86_64中选一个下载.seh结尾是纯64位编译.sjlj结尾是32 64两种编译,需加-m32或-m64参数.posix通常用于跨平台,比win32兼容性好一些. 截图记之 原文地址:https://www.cnbl

线程模型的综述

本文首先介绍了一些线程基础,比如并发.并行.内存分配.系统调用.POSIX线程.接着通过strace分析了线程与进程的区别.最后以Android.Golang等线程模型进行了分析. 基础 1. 什么是并发(Concurrent),什么是并行(Parallels)? 并发指同时进行多个计算任务. 并行指通过切换时间片模拟进行多个计算任务. 详细可以参考Difference between concurrent programming and parallel programming - stack

Linux 线程模型的比较:LinuxThreads 与 NPTL

Linux 线程模型的比较:LinuxThreads 与 NPTL 本文参照来源:IBM开发者论坛 前奏:关于POSIX 可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945.此标准源于一个大约开始于1985年的项目.POSIX这个名称是由理查德·斯托曼应IEE

Linux 线程实现机制分析 Linux 线程实现机制分析 Linux 线程模型的比较:LinuxThreads 和 NPTL

Linux 线程实现机制分析 Linux 线程实现机制分析  Linux 线程模型的比较:LinuxThreads 和 NPTL http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 自从多线程编程的概念出现在 Linux 中以来,Linux 多线应用的发展总是与两个问题脱不开干系:兼容性.效率.本文从线程模型入手,通过分析目前 Linux 平台上最流行的 LinuxThreads 线程库的实现及其不足,描述了 Linux 社区是