线程创建、CRT 和 DLL 是如何完成的?

2024-02-08

所以我知道 CreateThread 和 CRT 可能会导致内存泄漏,信号不起作用,应该使用 _beginthread 或 _beginthreadex 函数。

在编写应用程序时这一切都很好,但是那些为其他应用程序编写 dll 等的人(无论是普通的 c dll、com 对象、插件等)又如何呢?没有办法保证调用 DLL 的线程是如何创建的,即使它们使用了 __beginthread(ex),很可能它们有不同的 CRT 实现\版本。

那么程序员到底应该做什么呢?不使用CRT?生成一个内部线程并将所有工作卸载到该线程(不使用带有调用线程的 CRT)? DllMain 和附加/分离内容的一些技巧可以正确设置和关闭所有线程,无论它们是如何创建的?


CreateThread 和 CRT 可能会导致内存泄漏

不,这是一个由于某种原因很难消除的误解。在上个世纪,使用 _beginthread() 是必要的,VS6 是 VS 的最后一个版本,其 CRT 仍然需要它。

这个问题已经得到修复,在很大程度上是为了处理对 Windows 2000 中添加的线程池的支持。显然,您无法在 CRT 中执行任何操作来处理它们,这些线程是由操作系统本身启动的。实现非常简单。无论 CRT 需要线程局部变量(例如 strtok() 所需的变量),它都会首先检查是否已为线程分配 TLS 存储。如果没有,它会动态分配它。

只需使用 CreateThread() 即可,无需担心,当然,前提是您不再使用 14 年前的编译器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程创建、CRT 和 DLL 是如何完成的? 的相关文章

  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 如何在Windows 8上正确使用SCardGetStatusChange?

    智能卡服务在 Windows 8 上的行为有所不同 并且 MSDN 尚未更新其文档 任何人都可以提供有关如何正确调用 SCardGetStatusChange 来监视 Windows 8 上的智能卡操作的代码片段吗 提前致谢 这是我为个人博
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它

随机推荐

  • 将深度复制构造函数添加到 std::unique_ptr

    我想储存一些std unique ptr
  • 在 OpenCV 上获取屏幕尺寸

    如何获取 OpenCV 上的计算机屏幕分辨率 我需要使用整个屏幕宽度并排显示两个图像 OpenCV 需要我想要创建的确切窗口大小 您可以在有或没有 opencv 的情况下使用此解决方案跨平台解决方案 if WIN32 include
  • 为什么 Vue.js 允许推送到 prop 数组?

    当我们尝试直接更改 prop 值时 Vue js 会显示警告 如下所示 Vue component Games template div ol li game li ol div
  • 在C#中,有没有办法始终能够获取当前焦点窗口的选定文本内容?

    在我的 c Net 应用程序中 我一直在尝试能够检索当前聚焦窗口中当前选定的文本 注意可以是windows中打开的任何窗口 比如word 或者safari 我能够检索当前聚焦控件的句柄 使用对 user32 dll 和 kernel32 d
  • C++ 中阿拉伯字符串的反转

    如何使用 C 反转阿拉伯字符串 例如 的反义词是 阿拉伯字母的形状根据单词中的位置而不同 词首 词中或词尾 连接阿拉伯字母还有其他规则吗 正如 Petesh 所说 根据我能找到的参考资料 例如维基百科 http en wikipedia o
  • d3 色阶 - 与多种颜色呈线性?

    我正在尝试创建一些类似于量化标度的东西 但其行为类似于线性色标 当我尝试将多种颜色放入线性比例时 它似乎只在前两种颜色之间进行缩放 我想要多种颜色 例如量化比例 但在这些颜色之间淡入淡出 我不确定这是否可能 red and green wo
  • NoSuchMethodError:Jersey 客户端中的 MultivaluedMap.addAll

    我正在尝试使用 Jersey Client 模拟对我的 Web 服务的 HTTP 请求 我尝试实施简单的例子 http jersey java net documentation latest user guide html d0e2365
  • 如何在 Swift 中将键分配给 SKActions

    我希望有人能够帮助我解决这个问题 我似乎找不到一种方法来为removeActionWithKey 方法的Sprite Kit 的SKAction 分配键 我还尝试将操作分配给字典中的键 但程序无法识别键分配 因此返回零值 这是我尝试做的 v
  • C++中的动态对象[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我从c 转到c 我不明白什么是动态对象 所以想象一下你有 A 类并创建像 A a new A 这样的对象是正常的 但是对象 a 是什么 它和
  • 客户端服务器程序的多线程

    我正在尝试使用我一直在开发的客户端 服务器程序来实现多线程 我需要允许多个客户端同时连接到服务器 我目前有 4 个类 一个客户端 一个服务器 一个协议和一个处理线程的工作人员 以下代码是我为这些类编写的代码 套接字服务器类 public c
  • Jmeter 而控制器似乎没有将变量评估为数字

    我正在编写一个 jmeter 脚本 该脚本会不断加载数据 直到表达到指定的大小 我有一个 while 循环 其中有一个 HTTP 采样器来加载数据 然后是另一个带有 XPath 后处理器的 HTTP 采样器来检查表大小 它们调用两个不同的
  • get_dummies (Pandas) 和 OneHotEncoder (Scikit-learn) 之间的优缺点是什么?

    我正在学习不同的方法将分类变量转换为机器学习分类器的数字 我遇到了pd get dummies方法和sklearn preprocessing OneHotEncoder 我想看看它们在性能和使用方面有何不同 我找到了一个关于如何使用的教程
  • 树形视图闪烁?

    我开始知道 通过添加 TreeView BeginUpdate 将防止树视图闪烁 但是当我将其添加到我的项目中时 树视图的所有节点都会消失 任何人都可以告诉我为什么会发生这种情况 这是我使用 TreeView 的代码片段 BeginUpda
  • ios google登录,如何获取用户图片url?

    我正在研究 iOS Swift 谷歌登录 我在github上做了一个demo 我的演示项目 https github com tanggod GoogleSignIn git https github com tanggod GoogleS
  • 使用python删除某些文件

    我有一个 py 脚本 可以处理扩展名为 hgx 的文件 示例 test hgx 有很多这样的扩展名为 hgx 的文件 该脚本处理 test hgx 并创建一个新的 test bac hgx 并在重新运行时创建 test bac bac hg
  • 如何获取存储库 /network 的完整 github.com 可视化

    EDIT 这应该是给我母亲的礼物 如果需要的话 我会将它拖放并将一堆丝网印刷品缝合在一起 但是该资源必须位于网站上的某个地方 我相信至少这个网站上有人知道如何做到这一点 EDIT 所以我进一步研究了这个问题 发现如果你把 meta 放在网络
  • Windows 10 通用应用程序 - 类型同时存在于“Windows.Foundation.UniversalApiContract”中

    不知何故 我什至没有做任何事情 我在 Visual Studio 2015 中遇到很多错误 但我无法理解问题到底是什么 它说两个 Windows Foundation UniversalApiContract 库中都存在很多 类型 有人可以
  • 将 defer 与指针一起使用

    假设我有以下代码 func getConnection fileName string os File file err os Open fileName Check for error return file 我使用此函数打开一个文件 并
  • clang 对 C++ 11 lambda 的支持

    我有这个使用 lambda 的 C 11 代码 这是一个示例 include
  • 线程创建、CRT 和 DLL 是如何完成的?

    所以我知道 CreateThread 和 CRT 可能会导致内存泄漏 信号不起作用 应该使用 beginthread 或 beginthreadex 函数 在编写应用程序时这一切都很好 但是那些为其他应用程序编写 dll 等的人 无论是普通