C + + 11的std ::线程与Windows CreateThread的

哪个选项更适合在Visual C ++下创build(和pipe理)线程:C ++ 11 std::thread或者WinAPI函数(比如CreateThread_beginthreadex等),为什么?

可移植性

std::thread对于C ++ 11来说是新的标准 – 通过它,你可以在支持C ++ 11的编译器中用C ++编写可移植的代码。 你可以感受到future

它基于boost::thread ,它支持不支持C ++ 11的较老的编译器,这使得移植到其他平台更容易。

如果你需要使用平台特定的技巧, std::thread::native_handle是要走的路。

CreateThread特定于WinAPI,这意味着编写不可移植的代码。 而且,这个API很旧,使用起来也不方便。

RAII

WinAPI是一个不鼓励现代C ++ 良好 实践的C API。 你创建的每一个线程原语,你都必须手动销毁。

C ++ 11中的线程库并非如此,这使得更高级的抽象更易于编写。 虽然std::thread还是相当低级的(无论是你的.join()还是.detach()你的线程,或者线程的析构函数都会终止你的程序),C ++ 11线程库有std::lock_guard和其他的锁支持RAII的互斥类。

虽然C ++ 11具有一些更高级的抽象,比如std::async启动函数,但是它不提供像线程池(threadpools)这样的其他抽象,因此您可能需要使用其他库。

类型安全

WinAPI只能调用具有特定签名的函数指针 – 容易出现与类型安全,对象生命周期和内存管理不当有关的错误。

std::thread可以调用任何可调用的对象:

 // call free-standing function in a separate thread std::thread first(func); // call free-standing function with arguments (1, 2), in a separate thread std::thread second(func, 1, 2); // call static member function in a separate thread std::thread third(&A::static_memfun); // call non-static member of a temporary in a separate thread std::thread fourth(&A::memfun, A()); //call std::function in a separate thread std::function<void(int)> callback = std::bind(func, 1, _1); std::thread fifth(callback, 2); // call a function object Functor f; std::thread sixth(f); 

TL; DR :没有理由在新的C ++代码中使用WinAPI线程作为主线程机制。

跨平台性是一个小好处。 真正的好处是在界面上。 std::thread提供RAII-保证std::thread的清理,并且支持任意的函数对象参数,而不仅仅是函数指针。 std::thread是CreateThreadEX上的C ++ 11封装,这是有原因的。

正如一个侧面说明,std :: thread是一个可怕的,可怕的API。 如果你自己创建线程,你可能做错了。 使用真正的线程API,如英特尔的TBB或微软的PPL,这是远远优于可怕的 std::thread某种方式更糟糕的 CreateThreadEx。 std::thread就像是:“嘿,伙计们,我提供了跨平台的mmap ,所以你可以自己写malloc ,享受!”

你应该使用std :: thread。

std :: thread是(new)标准的一部分,并且是可移植的。

除非你只是针对Windows,而你需要使用WinAPI与你的线程进行交互,否则std :: thread就是要走的路。