3

我开始研究多线程。而且我发现了 2 种使用它的方法 ic C++。首先是通过thread

#include <thread>
...
std::thread t(function);
<< some code>> 
t.join(); //(or detach)

第二个是process

#include <process.h>
...
_beginthreadex('bunch of parameters');
<< some code >>
_endthreadex()

那么,如果有的话,有什么区别?如果有区别,什么时候应该使用一个而不是另一个?

4

2 回答 2

3

坚持使用 C++ 中的第一种和标准的方式来创建线程,即使用 std::thread。

第二个是微软特有的。我怀疑现在有人会使用它。看到这个:https ://www.quora.com/When-do-we-write-include-process-h/answer/Sergey-Zubkov-1

于 2020-01-12T02:20:18.493 回答
2

您错过了一个:CreateThread(),它也是 Microsoft (WinAPI) 特有的,在许多 Windows 程序中都可以找到。

如果有的话,有什么区别?

_beginthreadex并且CreateThread是非标准的 Microsoft/Windows 特定功能。

_beginthread支持在托管代码中启动线程,这在混合环境中可能很有用。

CreateThread是用于创建线程的本机 WinAPI 调用。这是您可以在经典 Windows 程序中找到的调用。此调用返回的线程句柄使您能够以不同的方式控制线程,例如,通过调用SetThreadPriority()等。

Using<thread>是自 C++11 以来执行线程的标准方法。它拥有您所需要的大部分功能 - 但缺乏一些特定于平台的支持来处理线程。然而,标准库创建的线程可以返回本地线程句柄以启用优先级等,方法是使用具有该句柄的平台特定调用。

如果有区别,什么时候应该使用一个而不是另一个?

由于您正在学习线程并且没有在旧代码中挖掘,因此您绝对应该使用<thread>. 在您觉得需要使用本机调用以特定于平台的方式处理线程之前可能需要很长时间 - 如果您这样做了,您仍然可以获得本机句柄。

使用<thread>还可以使您的程序可移植。在 Posix 环境中,线程通常由 Posix Threads 完成(使用与 Windows API 完全不同的 API),但是通过创建使用纯<thread>调用的代码,您可以使移植程序成为问题。它只是工作。

于 2020-01-12T02:59:50.643 回答