【问题标题】:_beginthread vs CreateThread_beginthread 与 CreateThread
【发布时间】:2011-01-07 05:16:52
【问题描述】:

Windows 中的 CreateThread 和 beginthread API 有什么区别?哪个更适合创建线程?

【问题讨论】:

    标签: c windows multithreading


    【解决方案1】:

    早期版本的 Microsoft CRT 需要 _beginthread()_beginthreadex() 来初始化线程本地状态。 strtok() 函数就是一个例子。已经修复了,该状态现在被动态初始化,至少从 VS2005 开始。使用CreateThread() 不再导致问题。

    【讨论】:

    • 是 - 如果使用CreateThread() 创建线程,那么strtok() 将分配每个线程数据块。但是,当线程退出时,该块将被泄漏。可能没什么大不了的,但为什么不首先使用_beginthreadex()?此外,对于新的“打包应用程序”,_beginthreadex()(来自 VS 2012)将确保在新线程中初始化 MTA。为什么不让程序员养成使用_beginthreadex() 的习惯(与使用CreateThread() 相比,它确实没有任何缺点——它甚至具有基本相同的签名)。
    • @Michael - 检查 CRT 源代码,寻找它使用 FlsAlloc() 安装回调以释放内存的方式。不能在线程池线程中使用 CRT 当然是不可接受的限制。
    猜你喜欢
    • 2010-09-24
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    相关资源
    最近更新 更多